elasticsearch 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。
检查bootstrap.memory_lock设置是否生效: curl http://127.0.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报错如下:
[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内存大小
#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文件内容
elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
需要将elasticsearch替换为运行Elasticsearch程序的用户,使用root执行:service elasticsearch start实际上是以elasticsearch用户来执行
3、在/etc/systemd/system/elasticsearch.service.d目录下创建一个文件override.conf,并添加下列内容
[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