弹性搜索最大虚拟内存区域vm.max_map_count [65530]太低,至少增加到[262144]

时间:2018-07-20 15:26:17

标签: elasticsearch limit systemd cgroups

我对ElasticSearch的systemd配置有问题。

[Unit]
Description=platform-elasticsearch
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
User={{ app_user }}
Group={{ app_group }}
Environment=ES_PATH_CONF=/platform/opt/elasticsearch-{{ elasticsearch.version }}/config
Environment=JAVA_HOME=/platform/opt/jdk{{ jdk.major_version }}_{{ jdk.minor_version }}
LimitAS=infinity
LimitRSS=infinity
LimitCORE=infinity
LimitNOFILE=100000
LimitMEMLOCK=100000
StandardOutput=syslog
StandardError=syslog
WorkingDirectory=/platform/var/app/elasticsearch
ExecStart=/platform/opt/elasticsearch-{{ elasticsearch.version }}/bin/elasticsearch
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s -TERM $MAINPID
TimeoutStopSec=60
# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143 0
Type=simple
Restart=on-failure
RestartSec=10
PIDFile=/platform/var/run/elasticsearch.pid

[Install]
WantedBy=multi-user.target

这似乎无法让我配置vm.max_map_count设置。

Jul 20 14:53:46 scratchpad elasticsearch: [2018-07-20T14:53:46,359][INFO ][o.e.b.BootstrapChecks    ] [1oQJNUK] bound or publishing to a non-loopback     address, enforcing bootstrap checks
Jul 20 14:53:46 scratchpad elasticsearch: ERROR: [1] bootstrap checks failed
Jul 20 14:53:46 scratchpad elasticsearch: [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
Jul 20 14:53:46 scratchpad elasticsearch: [2018-07-20T14:53:46,376][INFO ][o.e.n.Node               ] [1oQJNUK] stopping ...
Jul 20 14:53:46 scratchpad elasticsearch: [2018-07-20T14:53:46,414][INFO ][o.e.n.Node               ] [1oQJNUK] stopped
Jul 20 14:53:46 scratchpad elasticsearch: [2018-07-20T14:53:46,414][INFO ][o.e.n.Node               ] [1oQJNUK] closing ...
Jul 20 14:53:46 scratchpad elasticsearch: [2018-07-20T14:53:46,445][INFO ][o.e.n.Node               ] [1oQJNUK] closed
Jul 20 14:53:46 scratchpad systemd: platform-elasticsearch.service: main process exited, code=exited, status=78/n/a

具体问题如下:

Jul 20 14:53:46 scratchpad elasticsearch: [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

我已经能够使用以下命令在命令行上开始弹性搜索:

sudo su -c 'echo 262144 > "/proc/sys/vm/max_map_count"' && \ 
export JAVA_HOME=/platform/opt/jdk1.8.0_181 && \
export ES_PATH_CONF=/platform/opt/elasticsearch-6.3.1/config && \
/platform/opt/elasticsearch-6.3.1/bin/elasticsearch 

谁能告诉我为什么LimitMEMLOCK = 100000不起作用,以及如何从systemd中有效设置max_map_count。

我还尝试设置以下内容:

cat /etc/security/limits.d/30_elastic_limits.conf

vagrant       hard    nofile     500000
vagrant       hard    memlock     262144

但这似乎被systemd完全忽略了。

9 个答案:

答案 0 :(得分:19)

对于 windows 用户,使用 wsl 子系统

打开powershell 运行

wsl -d docker-desktop

然后

sysctl -w vm.max_map_count=262144

答案 1 :(得分:16)

Vivek's answer

sysctl -w vm.max_map_count=262144

是正确的,但是该设置将仅在会话期间持续。如果主机重新启动,则该设置将重置为原始值。

如果要永久设置此设置,则需要编辑/etc/sysctl.conf并将vm.max_map_count设置为262144。

主机重启后,您可以通过运行sysctl vm.max_map_count

来验证设置是否仍然正确。

答案 2 :(得分:12)

请参见Elasticsearch documentation about virtual memory。在Centos上,您可以使用以下命令:

sysctl -w vm.max_map_count=262144

答案 3 :(得分:3)

您还可以使用 single-node 发现类型解决内存限制问题。在环境中设置:discovery.type=single-node

docker-compose.yml

services:
  es:
    image: elasticsearch
    environment:
      - discovery.type=single-node

另见:

答案 4 :(得分:2)

这本身不是答案,而是从docker容器的角度对有操作问题的任何人的澄清/捷径。 我在Docker容器中运行的应用程序遇到了这个问题。 正如here by nishant

所述

您不需要在容器级别增加用于Elasticsearch的虚拟内存,您可以通过运行以下命令为主机添加虚拟内存:

sudo sysctl -w vm.max_map_count=262144

然后重新启动您的docker-containers。

正如上面val所解释的,以这种方式设置此max_map_count不会在运行Docker容器的机器重启后持续存在。因此您需要按照上面他的解释以更持久的方式保存它。

答案 5 :(得分:1)

请运行以下命令:sysctl -w vm.max_map_count=262144以增加Elasticsearch使用的默认虚拟内存。

注意::当您运行上述命令时,您的问题将得到解决,但这将是一个临时解决方案,因为节点/系统/容器将重新启动,您的更改将继续进行。因此,如果要永久设置此设置,则需要编辑/etc/sysctl.conf并将vm.max_map_count设置为262144

有关更多详细信息,请单击here

答案 6 :(得分:1)

使用所需参数将新条目插入/etc/sysctl.conf文件中:

vm.max_map_count = 262144

它使更改永久生效。

也可以运行:

sysctl -w vm.max_map_count=262144

更改内核的当前状态。

答案 7 :(得分:1)

最大虚拟内存区域vm.max_map_count [65530]太低,增加到至少[262144]。
请运行以下命令来解决此问题:

sysctl -w vm.max_map_count=262144

答案 8 :(得分:0)

对于单节点弹性搜索集群,我遇到了同样的问题。根据{{​​3}},要运行单个节点,您必须在 docker run 命令中使用 "discovery.type=single-node"

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.13.3

在 docker-compose.yml 中,您可以在下面指定:

version: '3.1'
services:
 elastic_search:
  image: docker.elastic.co/elasticsearch/elasticsearch:7.13.3
  container_name: es01
  environment:
   - "discovery.type=single-node"
   - node.name=es01
   - bootstrap.memory_lock=true
   - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  ports:
   - 9200:9200
  networks:
   - elastic
networks:
 elastic: