Elasticsearch 解决 memory_lock 问题

Elasticsearch 解决 memory_lock 问题

我是docker运行的es,数据目录存放到本地磁盘上。最近做优化,想加上 memory_lock 参数,发现有问题。发现很多人有类似的问题。但都没说在docker上怎么解决。我整理一下解决办法,现在看来挺简单的。

报错

docker 运行 es 6.5

run docker container

1
docker run --rm -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "bootstrap.memory_lock=true" docker.elastic.co/elasticsearch/elasticsearch:6.5.0

Error Message: Unable to lock JVM Memory: error=12, reason=Cannot allocate memory

1
2
3
4
5
6
7
8
[2018-11-21T07:03:05,384][WARN ][o.e.b.JNANatives         ] [unknown] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory
[2018-11-21T07:03:05,385][WARN ][o.e.b.JNANatives ] [unknown] This can result in part of the JVM being swapped out.
[2018-11-21T07:03:05,385][WARN ][o.e.b.JNANatives ] [unknown] Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
[2018-11-21T07:03:05,385][WARN ][o.e.b.JNANatives ] [unknown] These can be adjusted by modifying /etc/security/limits.conf, for example:
# allow user 'elasticsearch' mlockall
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
[2018-11-21T07:03:05,385][WARN ][o.e.b.JNANatives ] [unknown] If you are logged in interactively, you will have to re-login for the new limits to take effect.

我们去系统里添加

1
2
3
4
5
6
vim /etc/secruity/limits.conf

* soft memlock unlimited
* hard memlock unlimited
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

之后再运行容器,问题依旧存在。
在网上找了好多这个问题的文章,有好多说法,我先说我解决的办法

解决

只需要在docker container 运行时加上ulime的设置就可以了。

1
docker run --rm -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1 docker.elastic.co/elasticsearch/elasticsearch:6.5.0

因为 docker 默认没有加载系统的 ulimit ,所以我们在系统上配置是没有用的,需要传进去。
这块可以查看 docker ulimit 的相关文档。

检查

检查 memory_lock 是否生效

1
http://172.16.124.110:9200/_nodes?filter_path=**.mlockall

返回内容为 true 及生效

1
{"nodes":{"pSYaXnT1SsStth5Dbww2yA":{"process":{"mlockall":true}}}}

Q&A

如果你是二进制安装或源码,可以再系统中修改,

添加 elasticsearch 帐号。

limits.conf中添加
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

重新登入,重新启动es。

还有人说 在 ES_JAVA_OPS 中添加 -Djna.tmpdir=/目录

1
2
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch

二进制安装:

1
2
3
4
5
6
7
systemd:  
/usr/lib/systemd/system/elasticsearch.service set: LimitMEMLOCK=infinity
SysV:
/etc/sysconfig/elasticsearch set: MAX_LOCKED_MEMORY=unlimited
Upstart:
/etc/default/elasticsearch set: MAX_LOCKED_MEMORY=unlimited
Then restart Elasticsearch.

二进制和源码安装方式我没有验证过。来源于网络。

感觉文章还可以的话,帮忙点点下面的广告哦! 谢谢支持!

感谢您的支持!