什么是 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 时间点与业务日志、容器重启记录按时间线对齐,能快速判断是应用突发增长还是配额设得过低,从而决定优化代码还是调整限制。