关于linux:Elasticsearch进程内存锁定失败

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:/etc/sysconfig/elasticsearch上,您应该具有:

1
2
ES_JAVA_OPTS="-Xms4g -Xmx4g"
MAX_LOCKED_MEMORY=unlimited

(将4g替换为此处建议的一半可用RAM)

2)/etc/security/limits.conf

在安全限制配置:/etc/security/limits.conf上,您应该具有

1
2
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

3)/usr/lib/systemd/system/elasticsearch.service

在服务脚本:/usr/lib/systemd/system/elasticsearch.service上,请取消注释:

1
LimitMEMLOCK=infinity

您应该在更改服务脚本后执行systemctl daemon-reload

4)/etc/elasticsearch/elasticsearch.yml

最后在elasticsearch配置上:/etc/elasticsearch/elasticsearch.yml,您应该添加:

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上,文件/usr/lib/systemd/system/elasticsearch.service中没有条目LimitMEMLOCK=infinity

    因此,将其添加到该文件中并在/etc/default/elasticsearch中设置MAX_LOCKED_MEMORY=unlimited就可以了。

    可以在/etc/elasticsearch/jvm.options文件中添加jvm选项。


    使用以下命令检查进程运行时的实际限制(尽管很短):

    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启动过程配置为unlimited。对于例如您可以使用另一个用户(在/etc/security/limits.conf中配置为root或在root中配置)来启动elasticsarch,同时在limits.conf(不适用于root用户)中定义通配符条目,则它将不起作用。

    测试以确保:
    你可以例如将ulimit -a ; exit放在/etc/init.d/elasticsearch中的" #Start守护程序"之后,并从bash /etc/init.d/elasticsearch start开始(相应于您的启动机制)。