Elasticsearch(ES)的内存设置是影响性能和稳定性的关键因素,主要集中在 JVM 堆内存 和 操作系统内存 的合理分配上。以下是详细的设置指南和最佳实践:
Elasticsearch 依赖 Lucene(底层搜索引擎),而 Lucene 会利用 操作系统文件缓存(OS File Cache) 来加速查询(缓存倒排索引、分片数据等)。因此,不要将 ES 的 JVM 堆内存设置为服务器全部内存,必须预留足够内存给操作系统,用于文件缓存。
ES 的 JVM 堆内存通过 -Xms(初始堆)和 -Xmx(最大堆)参数控制,需遵循以下规则:
-Xms 和 -Xmx 必须设置为相同值,防止 JVM 动态调整堆内存导致的性能波动(例如 GC 时扩容/缩容)。
ES 的 JVM 参数配置文件为 config/jvm.options(ES 7.x+ 推荐,旧版本可能在 bin/elasticsearch.in.sh 或环境变量中)。
示例(假设服务器内存 64GB,堆设为 32GB/31GB?选31G更安全):
编辑 config/jvm.options,添加/修改:
# 初始堆 = 最大堆 = 31g(留1G余量,避免刚好32G触发压缩指针失效)
-Xms31g
-Xmx31g
注:若用 Docker/ Kubernetes 部署,可通过环境变量
ES_JAVA_OPTS设置:
docker run -e ES_JAVA_OPTS="-Xms31g -Xmx31g" elasticsearch:8.0
预留 50% 系统内存给操作系统,用于:
示例:
Swap 会导致 ES 性能急剧下降(内存不足时换页到磁盘)。需禁用或降低 Swappiness:
sudo swapoff -a
/etc/fstab,注释掉 Swap 相关行(如 #/dev/sda5 none swap sw 0 0)。# 临时设置
sudo sysctl vm.swappiness=1
# 永久设置(写入 /etc/sysctl.conf)
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf
若通过 systemd 管理 ES,可限制进程最大内存(避免 ES 意外占用过多内存):
编辑 ES 的 systemd 服务文件(如 /usr/lib/systemd/system/elasticsearch.service),添加:
[Service]
LimitMEMLOCK=infinity # 允许 ES 锁定内存(避免被 Swap)
MemoryLimit=XXG # 可选:限制 ES 总内存(堆 + 非堆),例如 64GB 服务器设为 48G
然后重启 systemd:sudo systemctl daemon-reload && sudo systemctl restart elasticsearch
ES 用于缓存待写入磁盘的索引数据,默认值为 堆内存的 10%,可通过 elasticsearch.yml 调整:
# 索引缓冲区大小(默认10%,若写入量大可适当调大,但不建议超过20%)
indices.memory.index_buffer_size: 15%
查看 JVM 堆配置:
curl -X GET "http://localhost:9200/_nodes/jvm?pretty"
输出中 heap_init_in_bytes 和 heap_max_in_bytes 应相等,且符合设置值。
查看内存使用:
free -h # 查看操作系统内存(Used 中应包含文件缓存)
ps aux | grep elasticsearch # 查看 ES 进程内存占用
| 组件 | 建议配置 | 原因 |
|---|---|---|
| JVM 堆内存(Xms/Xmx) | 系统内存的 50%,且 ≤ 31GB | 压缩指针、预留文件缓存 |
| 操作系统内存 | 系统内存的 50% | Lucene 文件缓存、系统进程 |
| Swap | 禁用或 Swappiness=1 | 避免内存换页 |
根据你的服务器内存规模调整即可,例如:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。