LabHub
学习 学习路径 课程

Linux 故障处理

OOM Killer 挑的是谁

在 LabHub 中继续学习

一句话总结

OOM Killer 主要按实际驻留内存而非虚拟地址空间评分;退出码 137 只表示收到 SIGKILL,并不能单独证明 OOM。

概念图: 一句话总结 · 判断方法 · 原文命令与标识符

判断方法

应用日志突然中断是线索,因为 SIGKILL 无法被捕获。必须查看内核记录,区分节点全局 OOM 与 cgroup OOM。交换空间只会推迟 OOM,并可能先造成严重抖动。

评分考虑 RSS、交换页和页表,再叠加 oom_score_adj;特殊值可让关键进程完全不被选择。容器内 free 常展示宿主机数据,真实上限、当前使用量和 OOM 事件应从 cgroup 文件读取。

判断内存压力应看 MemAvailable 而非 MemFree。多个进程 RSS 相加会重复计算共享页,容量分析宜看 PSS。Kubernetes request 还影响节点压力下的存活顺序,故不能故意填写过低。

原文命令与标识符

points = rss + swapents + (pgtables / PAGE_SIZE)      # 단위: 페이지
adj    = oom_score_adj * (totalpages / 1000)
badness = points + adj
dmesg -T | grep -iE 'killed process|out of memory|oom-kill'
journalctl -k --since "1 hour ago" | grep -i oom
cat /sys/fs/cgroup/<경로>/memory.events   # oom_kill 이 0이 아니면 이미 죽었다
kubectl get pod <파드> -o jsonpath='{.status.containerStatuses[0].lastState.terminated.reason}'
cat /proc/meminfo | grep -E 'MemAvailable|Committed_AS|CommitLimit'
sysctl vm.overcommit_memory vm.overcommit_ratio

top

oom_score_adj

oom_score_adj

-1000

oom-kill:

constraint

CONSTRAINT_NONE

CONSTRAINT_MEMCG

memory: usage/limit/failcnt

free -m

/sys/fs/cgroup/memory.max

memory.current

memory.events

max

oom

oom_kill

max

oom_kill

MemFree

MemAvailable

free

free

available

/proc/PID/smaps_rollup

oom_score_adj

total-vm

anon-rss

oom_score_adj

OOMKilled

free -h

available

used

available

buff/cache

malloc

oom_score_adj

/proc/meminfo

oom_score_adj