Elasticsearch process memory locking failed
我已经设置了boostrap.memory_lock = true
更新了/etc/security/limits.conf,为弹性搜索用户添加了无限内存锁
我的弹性搜索运行了好几个月。 突然失败了一天前。 在日志中,我可以看到以下错误,并且过程永远不会开始
错误:引导检查失败
要求弹性搜索过程进行内存锁定,但内存未锁定
我按ulimit -as,我可以看到最大锁定内存设置为无限制。 这是怎么了? 我已经尝试了几个小时,但徒劳无功。 请帮忙。
操作系统是RHEL 7.2
Elasticsearch 5.1.2
ulimit-作为输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | core file size (blocks -c) 0 data seg size (kbytes -d) unlimited scheduling policy (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 83552 max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 65536 pipe size (512 bytes, -q) 8 POSIX message queues (bytes,-q) 819200 real-time priority (-r) 0 stack size kbytes, -s) 8192 cpu time seconds, -t) unlimited max user processes (-u) 4096 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited |
这是我为锁定RedHat / Centos 7上的ES节点上的内存所做的工作(如果其他发行版使用systemd,它将在其他发行版上工作)。
您必须在4个不同的地方进行更改:
1)/ etc / sysconfig / elasticsearch
在sysconfig:
1 2 | ES_JAVA_OPTS="-Xms4g -Xmx4g" MAX_LOCKED_MEMORY=unlimited |
(将4g替换为此处建议的一半可用RAM)
2)/etc/security/limits.conf
在安全限制配置:
1 2 | elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited |
3)/usr/lib/systemd/system/elasticsearch.service
在服务脚本:
1 | LimitMEMLOCK=infinity |
您应该在更改服务脚本后执行
4)/etc/elasticsearch/elasticsearch.yml
最后在elasticsearch配置上:
1 | bootstrap.memory_lock: true |
就是这样,重新启动您的节点,RAM将被锁定,您应该注意到性能有了很大的提高。
1 2 | OS = Ubuntu 16 ElasticSearch = 5.6.3 |
我以前也有同样的问题。
我设置在elasticsearch.yml中
1 | bootstrap.memory_lock: true |
我进入了日志:
要求弹性搜索过程进行内存锁定,但内存未锁定
我尝试了几件事,但实际上您只需要做一件事(根据https://www.elastic.co/guide/zh-CN/elasticsearch/reference/master/setting-system-settings.html);
文件:
1 | /etc/systemd/system/elasticsearch.service.d/override.conf |
加
1 2 | [Service] LimitMEMLOCK=infinity |
一点解释。
真正有趣的是systemd根本不关心ulimit设置。 (https://fredrikaverpil.github.io/2016/04/27/systemd-and-resource-limits/)。您可以轻松地检查这一事实。
在/etc/security/limits.conf中设置
elasticsearch-无限锁
检查Elasticsearch最大锁定内存是否没有限制
$ sudo su elasticsearch -s / bin / bash
$ ulimit -l
禁用bootstrap.memory_lock:在/etc/elasticsearch/elasticsearch.yml中为true
#bootstrap.memory_lock:是
通过systemd启动服务elasticsearch
#service elasticsearch start
检查最大内存锁定设置之后有服务elasticsearch
开始了
#systemctl显示elasticsearch | grep -i limitmemlock
我的天啊!尽管我们通过ulimit,systemd设置了无限的最大memlock大小
完全忽略它。
1 | LimitMEMLOCK=65536 |
因此,我们得出结论。
通过启用的systemd启动elasticsearch
bootstrap.memory_lock:是
我们不需要关心ulimit设置,但是我们需要
在systemd配置文件中明确设置它。
故事的结尾。
尝试设置
在/ etc / sysconfig / elasticsearch文件中
设置MAX_LOCKED_MEMORY =无限
在/usr/lib/systemd/system/elasticsearch.service中
设置LimitMEMLOCK = infinity
关注了这个帖子
在带有Elasticsearch 6.x的ubuntu 18.04上,文件
因此,将其添加到该文件中并在
可以在
使用以下命令检查进程运行时的实际限制(尽管很短):
1 | cat /proc/<pid>/limits |
您会发现类似于以下内容的行:
1 2 3 4 5 6 7 | Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes <truncated> |
然后,取决于运行器或容器(在我的情况下,这是主管的minfds值),您可以取消实际的限制配置。
我希望它能为更一般的情况提供一些提示。
确保您的elasticsearch启动过程配置为
测试以确保:
你可以例如将