bootstrap.memory_lock简要说明

https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html#mlockall

bootstrap.memory_lock

由于当jvm开始swapping时es的效率会降低,所以要保证它不swap,这对节点健康极其重要。实现这一目标的一种方法是将 bootstrap.memory_lock 设置为true。
要使此设置有效,首先需要配置其他系统设置。有关如何正确设置内存锁定的更多详细信息,请参阅启用bootstrap.memory_lock。

bootstrap.memory_lock: 是否锁住内存,避免交换(swapped)带来的性能损失,默认值是: false
bootstrap.system_call_filter: 是否支持过滤掉系统调用。elasticsearch 5.2以后引入的功能,在bootstrap的时候check是否支持seccomp。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
检查bootstrap.memory_lock设置是否生效:
get http://10.127.0.1:9200/_nodes?filter_path=**.mlockall
响应:
{
"nodes": {
"9giihmDNRdS136KT52Gl5g": {
"process": {
"mlockall": true
}
},
"X0zQESeeT8uJ9kVXvHpl-w": {
"process": {
"mlockall": true
}
},
"w4hYw86rQhqL1ayGyUK1Kw": {
"process": {
"mlockall": true
}
}
}
}

如果看到mlockall为false,则表示mlockall请求失败。还将在日志中看到一行”Unable to lock JVM Memory”。

elasticsearch报错之 memory locking requested for elasticsearch process but memory is not locked:

安装elasticsearch报错如下:

1
2
3
[2019-01-14T03:57:16,453][ERROR][o.e.b.Bootstrap          ] [ip-172-31-30-62.ec2.internal] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked

网上查找资料,发现都不是适应自己的环境。最后在官网找到了方法:

不过先跟大家声明一点就是:环境不一样解决的方法也不一样,这里是Centos7.5版本的系统,所有的服务都由systemd来管理。elasticsearch是6.5.4版本,使用RPM包的方式安装的。

现在我们开始解决问题:

1、修改/etc/sysconfig/elasticsearch文件调整JVM内存大小
1
2
3
4
5
#ES_JAVA_OPTS="-Xms16g -Xmx16g" (内存大小也可以在/etc/elasticsearch/jvm.options配置文件中定义,或者ES_HEAP_SIZE=16g)
JAVA_HOME=/usr/java/jdk1.8.0_51
ES_HEAP_SIZE=16g
MAX_OPEN_FILES=655350
MAX_LOCKED_MEMORY=unlimited

替换16g为总内存的一半(Elasticsearch官方建议是主机总内存的一半)

2、修改/etc/security/limits.conf文件内容
1
2
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

需要将elasticsearch替换为运行Elasticsearch程序的用户,使用root执行:service elasticsearch start实际上是以elasticsearch用户来执行

3、在/etc/systemd/system/elasticsearch.service.d目录下创建一个文件override.conf,并添加下列内容
1
2
3
[Service]
LimitMEMLOCK=infinity
详情可以参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html#systemd
4、最后重新载入配置文件更新服务

systemctl daemon-reload

5、重启elasticsearch

service elasticsearch restart