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 | [2018-11-21T07:03:05,384][WARN ][o.e.b.JNANatives ] [unknown] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory |
我们去系统里添加
1 | vim /etc/secruity/limits.conf |
之后再运行容器,问题依旧存在。
在网上找了好多这个问题的文章,有好多说法,我先说我解决的办法
解决
只需要在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 | export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" |
二进制安装:
1 | systemd: |
二进制和源码安装方式我没有验证过。来源于网络。
感觉文章还可以的话,帮忙点点下面的广告哦! 谢谢支持!