防止弹性搜索被OOM杀手杀死

时间:2014-08-18 02:50:27

标签: elasticsearch

我是弹性搜索的新手,我猜测我配置服务器的方式是次优的,因为我遇到了OOM杀手在短暂之后杀死Elasticsearch / Java进程的问题虽然可以通过正确配置服务器来避免这种情况。能不能指出配置中需要更改哪些内容才能顺利运行ES?

在这两个服务器(集群)上,我有时会回到已被杀死的ES / java进程。

以下是当前设置:

===========================================

服务器1(前端服务器) 这台服务器有8GB的RAM,还运行gunicorn,Flask和Django

elasticsearch.yml:

node.master: true
node.data: true
bootstrap.mlockall: true

的/ etc /默认/ elasticsearch

ES_HEAP_SIZE=5g
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited

===========================================

服务器2(专用Elasticsearch服务器),内存为8GB,没有运行其他应用程序

elasticsearch.yml:

node.master: false
node.data: true
bootstrap.mlockall: true

的/ etc /默认/ elasticsearch

ES_HEAP_SIZE=5g
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited

===========================================

在elasticsearch.yml文件中,我看到一行代表" You should also make sure that the Elasticsearch process is allowed to lock the memory, eg. by using ulimit -l unlimited" 但我没有做任何事情来实现这一目标。我需要在这里采取任何行动吗?

如果我尝试输入,我会......

myuser@es1:~$ sudo ulimit -l unlimited
sudo: ulimit: command not found

2 个答案:

答案 0 :(得分:9)

以下是我在ES节点上锁定内存的方法,RedHat / Centos 7上的5.4.0版(如果使用 systemd ,它将适用于其他发行版)。

您必须在4个不同的地方进行更改:

1) / etc / sysconfig / elasticsearch

在sysconfig上:/etc/sysconfig/elasticsearch你应该:

ES_JAVA_OPTS="-Xms4g -Xmx4g" 
MAX_LOCKED_MEMORY=unlimited

(用建议的here替换4g HALF您可用的RAM)

2) /etc/security/limits.conf

在安全限制配置:/etc/security/limits.conf你应该

elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

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

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

LimitMEMLOCK=infinity

您应该在更改服务脚本

后执行systemctl守护程序重新加载

4) /etc/elasticsearch/elasticsearch.yml

最后在elasticsearch配置:/etc/elasticsearch/elasticsearch.yml你应该添加:

bootstrap.memory_lock: true

多数民众赞成重启您的节点,RAM将被锁定,您应该注意到性能的重大提升。

答案 1 :(得分:6)

所以没有太多你可以配置来防止OOM杀手被调用,但我会告诉你你可以做什么。回顾一下,当Linux认为内存不足并需要释放内存时,会调用OOM杀手。它会选择更长时间运行,高内存进程,这使得Elasticsearch成为主要目标。

你可以尝试的事情:

  1. 将任何其他生产代码移至另一个系统。至少在 前端系统,8GB内存,运行ES,5GB堆, Django和Flask可以强调你的内存使用量。通常是一个 更好的想法是在自己的硬件或实例上运行ES数据节点。

  2. 剪切堆大小。 Elasticsearch建议使用不超过一半 堆的内存,所以我把它减少到4GB或更少。你应该 然后密切监视堆使用情况并继续棘手 当你仍然有一个不错的保证金。

  3. 升级到具有更多内存的更大服务器。这将是我的号码 一个建议 - 你根本没有足够的内存可用 在一台服务器上做你想做的一切。

  4. 尝试将OOM杀手调整得不那么严格 - 这并不容易 我不知道由于服务器总体规模较小,你将获得什么 但你可以随时试验:

    https://unix.stackexchange.com/questions/58872/how-to-set-oom-killer-adjustments-for-daemons-permanently

    http://backdrift.org/how-to-create-oom-killer-exceptions

    http://www.oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html