Elasticsearch禁用交换

分享于 

3分钟阅读

Elasticsearch

  繁體

大多数操作系统尝试为文件系统缓存使用尽可能多的内存,并急切交换未使用的应用程序内存。

禁用所有交换文件

通常Elasticsearch是机器上运行的唯一服务,它的内存使用由JVM选项控制,不需要启用交换。

在Linux系统上,可以通过运行以下命令暂时禁用交换:


sudo swapoff-a

这不需要重新启动Elasticsearch。

要永久禁用它,你需要编辑/etc/fstab文件并注释掉包含单词swap的行。

在Windows上,可以通过完全通过System Properties → Advanced → Performance → Advanced → Virtual memory

配置swappiness

Linux系统上可用的另一个选项是确保sysctl值vm.swappiness设置为1,这减少了内核的交换趋势,并且在正常情况下不应使用交换,同时仍允许整个系统在紧急情况下进行交换。

启用bootstrap.memory_lock

防止虚拟内存被换出,这可以通过将这一行添加到config/elasticsearch.yml文件来完成:


bootstrap.memory_lock:true

如果mlockall试图分配比可用内存多的内存,就可能导致JVM或shell会话退出!

启动Elasticsearch之后,可以通过检查mlockall的值来查看是否成功应用了此设置:


GET_nodes?filter_path=**.mlockall

如果看到mlockallfalse,就意味着mlockall请求失败,你还会在日志中看到一条包含更多信息的行Unable to lock JVM Memory

在Linux/Unix系统上,最可能的原因是,运行Elasticsearch的用户没有权限锁定内存,可以按如下方式授予:

.zip.tar.gz在启动Elasticsearch之前,设置ulimit -l unlimited,或者在/etc/security/limits.conf中将memlock设置为unlimited。RPM和DebianMAX_LOCKED_MEMORY设置为unlimited

mlockall失败的另一个可能原因是JNA临时目录(通常是/tmp的子目录)是使用noexec选项安装的。这可以通过使用JNA环境变量ES_JAVA_OPTS为指定一个新的临时目录来解决:


export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>"
./bin/elasticsearch

或者在jvm.options配置文件中设置这个JVM标志。


相关文章