Elasticsearch内存超出JVM堆设置阈值导致服务器崩溃,缺少哪些限制配置?
问题原因
你配置的Xmx仅限制JVM堆内存,Elasticsearch总内存占用还包含堆外直接内存、Lucene页缓存、网络缓冲区、线程栈等额外开销,这些均不纳入Xmx统计范围,所以会出现进程总内存远超1G被系统OOM杀手终止的情况。
你缺少的内存限制配置如下:
1. JVM层面补充配置
修改ES安装目录下config/jvm.options文件,添加堆外内存限制:
# 限制堆外直接内存最大为512M,可根据实际堆大小调整,通常为Xmx的30%~50% -XX:MaxDirectMemorySize=512m
调整后JVM总可控内存(堆+堆外)约为1.5G。
2. Elasticsearch核心配置
修改config/elasticsearch.yml文件,添加以下配置:
- 开启内存锁定,避免堆内存被交换到磁盘导致内存浮动升高:
bootstrap.memory_lock: true - 配置内存断路器,限制查询、聚合等操作的内存占用,避免突发请求打爆内存:
# 字段数据缓存占堆内存比例上限 indices.breaker.fielddata.limit: 40% # 单个请求占堆内存比例上限 indices.breaker.request.limit: 60% # 所有断路器总占堆内存比例上限 indices.breaker.total.limit: 70%
3. CentOS8系统层面配置
- 调整系统资源限制,编辑
/etc/security/limits.conf添加如下规则,赋予ES进程内存锁定权限:elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited - 用systemd硬限制ES进程总内存上限,避免进程内存溢出拖垮整个服务器。编辑
/usr/lib/systemd/system/elasticsearch.service,在[Service]段添加:
修改后执行# 硬限制ES进程总内存最大为2G,可根据服务器实际内存调整 MemoryLimit=2Gsystemctl daemon-reload再重启ES生效。 - 关闭系统交换分区,执行
swapoff -a,永久关闭可编辑/etc/fstab注释swap分区挂载行。
内容的提问来源于stack exchange,提问作者Eng7
相关产品推荐
相关产品推荐

