已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我做了 8 年运维,OOM Killer 是生产 Linux 服务器上最让人头疼的高频告警之一。目前团队排查方式基本是 dmesg | grep -i oom + journalctl -k 人肉翻日志,效率低、容易漏根因,新人上手慢。我想把这套排查流程沉淀成一份可复用的手册 + 一个一键诊断脚本,让任何运维同学拿到手就能 5 分钟内定位 OOM 根因。
dmesg / journalctl / cat /proc/*/smaps 读权限| # | 场景 | 关键线索 |
|---|------|---------|
| 1 | Java 进程堆外内存(DirectByteBuffer / Metaspace)泄漏 | smaps 中 reserved 远大于 RSS,jcmd 输出 |
| 2 | K8s 容器 cgroup 内存超限被 kill | cgroup 的 memory.max / memory.events(v2)或 memory.limit_in_bytes(v1) |
| 3 | page cache 挤压导致可用内存不足 | MemAvailable 与 MemFree 差异大,/proc/meminfo 中 SReclaimable 高 |
| 4 | 内核 slab 泄漏(如 dentry / inode 缓存膨胀) | slabtop 中某 cache 对象数异常增长 |
| 5 | 内存碎片化导致大页分配失败 | buddyinfo 高阶空闲块为 0,/proc/vmstat 中 compact_stall 高 |
README.md:使用说明、环境要求、运行方式oom-troubleshooting.md:排查手册(≥1500 字,含 5 个场景)oom-diagnose.sh:一键诊断脚本(Bash,≥200 行,#!/usr/bin/env bash,set -euo pipefail)samples/:每个场景的预期输出样例文件oom_score_adj 在容器场景下是否还有意义?K8s 的 oomScoreAdj 注解和内核 oom_score_adj 的优先级关系是什么?memory.swap.max 和 v1 的 memory.memsw.limit_in_bytes 行为差异,对 OOM 触发时机有什么实际影响?vm.panic_on_oom=1)还是让它工作但做更好的资源隔离?