扩容时服务申请内存失败,日志里写 Cannot allocate memory,free 看 available 还有 6G,swap 也没满,重启进程能再撑一阵,看着完全不像是内存不够。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,overcommit_memory 设成 2 时内核按 CommitLimit 记账,虚拟内存承诺超过上限就直接拒绝,物理内存空着也没用,堆预留大的进程最先被卡,这个坑很隐蔽,别急着加内存。

「overcommit 策略」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

grep -E 'CommitLimit|Committed_AS' /proc/meminfo
sysctl vm.overcommit_memory vm.overcommit_ratio
sudo sysctl -w vm.overcommit_memory=0

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,读 CommitLimit 与 Committed_AS 看是否已经超限 两个数值放在一起比 差值就是余量;确认 overcommit_memory 当前取值和业务堆预留量 堆越大越容易被拦;改回按启发式或者按比例适度放宽 再重启验证 别直接关掉保护。

最后用这个标准收尾,Committed_AS 低于 CommitLimit 扩容时不再报 Cannot allocate memory 同规格压测一轮 才算真修好 持续观察半天。

作者 9823189