内存充足时Native memory allocation(mmap)失败问题排查与解决
容器化服务Native内存分配失败排查与解决
问题现象
- 运行多容器化Java应用及Postgres数据库的CentOS虚拟机,在部署镜像更新后数分钟内,多个服务出现
Native memory allocation(mmap)失败问题 - 40+台同配置虚拟机均出现该问题
- JVM进程报错无法分配约65KB内存,但
/proc/meminfo显示MemAvailable仍有约35GB;Postgres进程同样出现内存分配失败
无效排查尝试
- 曾按照Postgres官方建议设置
vm.overcommit_memory=2、vm.overcommit_ratio=95,但问题未得到解决
根因分析
- 核心原因是
Committed_AS已接近CommitLimit:当vm.overcommit_memory=2时,内核会严格拒绝任何超出CommitLimit的内存分配请求 - 容器未设置内存限制,仅通过Java的
-Xms/-Xmx限制堆内存大小,但Postgres及Java的非堆内存(如直接内存、元空间、JNI内存等)无限制,导致宿主机整体内存提交量持续增长,最终触达内核的提交上限
解决方案
- 为所有容器(尤其是Postgres容器)设置明确的内存限制,通过Docker的
--memory(或-m)参数控制容器可使用的最大内存,避免单个容器无节制占用内存,将宿主机的Committed_AS控制在CommitLimit范围内
内容的提问来源于stack exchange,提问作者notarobot
相关产品推荐
相关产品推荐

