首页/系统/Linux 内核与性能调优速查/oom_kill 计数与内存告警
内存与 OOM58 条

oom_kill 计数与内存告警

/proc/vmstat 的 oom_kill 计数累计系统内 OOM 次数;做增量监控可在业务无感知前发现内存问题。

什么是 oom_kill 计数

当系统内存耗尽且无法回收时,内核的 OOM killer 会挑选并终止进程以恢复可用内存,每发生一次就在 /proc/vmstat 的 oom_kill 计数上加一。/proc/vmstat 的计数是单调累计值,因此做监控要基于增量而不是绝对值;配合 dmesg 中记录的“Killed process”段落,可以定位被终止的进程与其内存占用。

基本信息

系统级计数grep oom_kill /proc/vmstat
事件明细dmesg -T | grep -i 'killed process'
采样方式定时读取并计算增量,接入监控告警
容器侧cgroup v2 的 memory.events 里有 oom 与 oom_kill 计数
相关文件/proc/pressure/memory 反映内存压力
判读重点增量非零即代表发生过真实的内存耗尽事件

典型使用场景

  • 服务莫名重启或无日志退出:确认是否被 OOM killer 终止
  • 建立告警:在没有业务报错前发现内存耗尽趋势
  • 容量评估:统计 OOM 发生频率,决定扩容还是优化
  • 容器与宿主对照:确认发生在哪一层,避免误判责任方
  • 故障复盘:把 OOM 时间点与业务日志时间线对齐

采样与定位

采样与定位
grep oom_kill /proc/vmstat                # 累计次数
watch -n5 'grep oom_kill /proc/vmstat'    # 持续观察增量
dmesg -T | grep -i 'killed process' | tail -3
dmesg -T | grep -i -E 'out of memory|oom-kill' | tail -5
cat /proc/pressure/memory                 # some/full 压力指标
cat /sys/fs/cgroup/<path>/memory.events   # 容器侧 oom 与 oom_kill 计数

计数来源对照

来源覆盖范围适用
/proc/vmstat宿主整机判断整体内存耗尽事件
cgroup memory.events单个控制组容器与服务的定向判断
dmesg 日志事件明细定位被终止的进程与时间
PSI memory 压力压力程度提前预警而非事后统计
告警建议基于增量与速率:累计值只增不减,用绝对值做阈值会在重启或多机对比时失去意义,速率才能反映当前风险。
容器内发生的内存 OOM 不一定体现在宿主的 oom_kill 计数上,只监控宿主会漏掉大量真实事件,容器侧指标必须一并采集。
把 OOM 时间点与业务日志、容器重启记录按时间线对齐,能快速判断是应用突发增长还是配额设得过低,从而决定优化代码还是调整限制。

易错点

  • 计数是累计值,告警应基于增量而非绝对值,否则重启或跨机器对比都会得出错误结论
  • 容器 memcg OOM 不一定体现在宿主 oom_kill 计数,需要容器侧指标补充,否则漏报
  • 看到进程被杀就认定内存泄漏:也可能是突发流量、缓存失控或限制设置过低,需结合内存曲线判断
  • 只处理被杀进程而不查根因,同一问题会周期性复发,服务反复重启

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • Linux 内核 mm/oom_kill.c
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌