现象
在鲲鹏 920 服务器(128 核 / 512GB 内存)部署 Elasticsearch 7.17 集群,运行 3 天后节点被 OOM Killer 杀掉。free -h 显示物理内存充足,但 dmesg 中有:
进程虚拟内存 520GB,远超堆内存设置(-Xmx31g)。
定位
检查堆外内存使用:
Lucene 的 MMapDirectory 映射了大量段文件到虚拟地址空间。鲲鹏 ARM64 的页表层级与 x86 不同,每个 mmap 区域的页表开销更大。
根因
- 页表开销:鲲鹏使用 4 级或 5 级页表,大内存映射时页表项数量远超 x86
- MMap 累积:默认
index.store.preload 预加载了过多段文件 - Circuit Breaker 失效:堆外内存估算在 ARM 上不够准确,限流未触发
修复
1. 限制 MMap 预加载
2. 启用内存锁定
3. 调整 Circuit Breaker
验证
教训
鲲鹏上跑 ES,MMap 不是免费的。页表开销在 ARM 上更显著,需要严格控制预加载范围,启用 memory_lock,并调整断路器阈值。建议用 jcmd VM.native_memory 定期监控堆外内存增长趋势。
现象
在鲲鹏 920 服务器(128 核 / 512GB 内存)部署 Elasticsearch 7.17 集群,运行 3 天后节点被 OOM Killer 杀掉。
free -h显示物理内存充足,但dmesg中有:进程虚拟内存 520GB,远超堆内存设置(-Xmx31g)。
定位
检查堆外内存使用:
Lucene 的 MMapDirectory 映射了大量段文件到虚拟地址空间。鲲鹏 ARM64 的页表层级与 x86 不同,每个 mmap 区域的页表开销更大。
根因
index.store.preload预加载了过多段文件修复
1. 限制 MMap 预加载
2. 启用内存锁定
3. 调整 Circuit Breaker
验证
教训
鲲鹏上跑 ES,MMap 不是免费的。页表开销在 ARM 上更显著,需要严格控制预加载范围,启用 memory_lock,并调整断路器阈值。建议用
jcmd VM.native_memory定期监控堆外内存增长趋势。