OOM Killer 挑的是谁
一句话总结
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