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

cas*_*ald 28 limit elasticsearch cgroups systemd

我有一个针对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
Run Code Online (Sandbox Code Playgroud)

这似乎不允许我配置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
Run Code Online (Sandbox Code Playgroud)

具体问题如下:

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]
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么LimitMEMLOCK = 100000不起作用,以及如何从systemd中有效地设置max_map_count.

我还尝试设置以下内容:

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

vagrant       hard    nofile     500000
vagrant       hard    memlock     262144
Run Code Online (Sandbox Code Playgroud)

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

帮助,现在有点绝望!

bur*_*vyg 51

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

vm.max_map_count = 262144
Run Code Online (Sandbox Code Playgroud)

它使更改永久化。

还运行:

sysctl -w vm.max_map_count=262144
Run Code Online (Sandbox Code Playgroud)

更改内核的当前状态。

如果你使用docker生效你应该重新启动它:

systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 docker-compose 在主机上运行容器,您还可以使用 root 权限运行此命令 sysctl -w vm.max_map_count=262144 来解决此问题。 (2认同)
  • 使用“sysctl vm.max_map_count=262144”(不带 -w),这样更改仅在操作系统关闭之前可用。它是一台开发机器。所以,我不想永久改变。 (2认同)

Val*_*Val 46

Vivek的答案是正确的,但是,设置只会在会话期间持续.如果主机重新启动,则设置将重置为原始值.

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

主机重新启动后,您可以通过运行验证设置是否仍然正确 sysctl vm.max_map_count

  • 不要忘记重启或:sysctl --system (8认同)
  • 请注意,如果重新启动计算机,配置将消失,因此此方法不是永久性的。 (2认同)

小智 32

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

打开powershell运行

wsl -d docker-desktop

然后

sysctl -w vm.max_map_count=262144
Run Code Online (Sandbox Code Playgroud)

  • 这对我在 Windows 10 机器上有用。最后一步是输入“exit”以退出 wsl。 (14认同)
  • 要保留更改,您可以将 vm.max_map_count = 262144 添加到 /etc/sysctl.conf (9认同)
  • 这似乎并不是 Docker Desktop 中的“粘性”更改——每次重新启动 Docker 时都必须运行该命令,这确实令人讨厌。 (4认同)
  • 保留“/etc/sysctl.conf”中的更改似乎无法长期工作,但 /sf/answers/5022013741/ 可以。 (3认同)

thi*_*ign 31

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

docker-compose.yml

services:
  es:
    image: elasticsearch
    environment:
      - discovery.type=single-node
Run Code Online (Sandbox Code Playgroud)

也可以看看:


小智 22

我在单节点弹性搜索集群中遇到了同样的问题。根据elastic-search 文档,为了运行单节点,您可以在 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
Run Code Online (Sandbox Code Playgroud)

在 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:
Run Code Online (Sandbox Code Playgroud)


top*_*olm 21

对于 WSL,您可以在以下位置创建配置文件 (.wslconfig):

C:\Users\[your user]\.wslconfig
Run Code Online (Sandbox Code Playgroud)

并放入:

[wsl2]
kernelCommandLine = "sysctl.vm.max_map_count=262144"
Run Code Online (Sandbox Code Playgroud)

这样就不用max_map_count每次重启电脑时都进行设置


Viv*_*ode 19

在Centos上,您可以使用以下命令:

sysctl -w vm.max_map_count=262144
Run Code Online (Sandbox Code Playgroud)


小智 10

从本质上说,这并不是一个答案,而是从docker容器的角度对有操作问题的任何人的澄清/捷径。我在Docker容器中运行的应用程序遇到了这个问题。而且正如nishant在这里解释的那样

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

sudo sysctl -w vm.max_map_count=262144
Run Code Online (Sandbox Code Playgroud)

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

As explained by val above setting this max_map_count this way won't persist upon the restart of the machine on which is running the docker container. and so you will need to save it in a more persistent manner as explained by him above.


Kes*_*dhi 7

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

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

欲了解更多详情,请点击此处


小智 5

这对我有用。

 sysctl -w vm.max_map_count=262144
Run Code Online (Sandbox Code Playgroud)