内存与 OOM58 条

dmesg OOM 日志解读

OOM 触发时 dmesg 会打印节点/memcg 内存概况、进程 rss 与 oom_score,最后才是 Killed process 结论行。

OOM 日志解读

OOM 触发时内核会打印一段结构化日志:先给出触发上下文(内存节点或 memcg 的内存概况),再列出被评估的进程及各自的 rss、oom_score 等,最后一行是 Killed process 的结论。新版内核还会附带 memcg 的用量信息。读日志时结论行之前的内容价值更高——谁在申请、谁被评估、最终牺牲了谁,连起来看才能判断是容量不足、内存泄漏还是限额设置不当。

基本信息

读取dmesg -T 中搜索 Out of memory
重点信息触发上下文、被评估进程表、最终牺牲者
新版内核日志会附带 memcg 的用量
容器场景宿主与容器两级日志都要看
相关文件/proc/<pid>/oom_score 与 oom_score_adj

典型使用场景

  • 服务突然消失且应用日志没有线索
  • 排查 OOM 选择牺牲进程的依据
  • 区分宿主级 OOM 与容器级 OOM
  • 定位潜在的内存泄漏进程
  • 复盘后把结论落到容量或限额调整上

查看完整段落

查看完整段落
dmesg -T | grep -n -B2 -A30 'Out of memory' | tail -60
dmesg -T | grep -i 'Killed process' | tail -5
journalctl -k --no-pager | grep -i -A20 'Out of memory' | tail -40
cat /sys/fs/cgroup/<组>/memory.events      # 容器级 OOM 计数
cat /proc/<pid>/oom_score /proc/<pid>/oom_score_adj
free -h; grep -E 'MemAvailable|Committed_AS' /proc/meminfo

日志各部分的价值

部分内容价值
触发上下文节点或 memcg 的内存概况判断是整机还是某个控制组先耗尽
被评估进程表各进程 rss 与 oom_score看谁最可能被牺牲以及原因
结论行被杀的进程与 PID只回答结果,不含原因
memcg 信息控制组用量(新版内核)容器场景下的关键线索
结论行之外的信息更有价值:申请者、被评估者与牺牲者要连起来读,才能定位到真正的根因。
虚拟化与容器场景要同时看宿主与容器两级日志,只查一边容易漏掉真正的限额触发点。

复盘步骤

  • 把日志中的申请者、被评估者与牺牲者对应到具体服务
  • 核对当时的可用内存、cgroup 限额与提交量,判断是容量问题还是限额问题
  • 反复触发时优先排查内存泄漏,按增长曲线定位到进程
  • 结论落到扩容、调整限额或应用修复三种动作之一

易错点

  • 只看结论行:不知道谁在申请内存,无法找到根因
  • 只看宿主日志:容器级 OOM 的证据在容器日志与 memory.events 里
  • 把 OOM 当偶发事件:反复出现说明容量或限额需要调整
  • 忽略 memcg 信息:容器场景下这是最有价值的上下文
  • 不保存现场:环形缓冲区会覆盖日志,应尽早导出留证

数据来源与参考

  • Linux 内核 mm/oom_kill.c 输出格式
  • Linux 内核 Documentation/admin-guide/mm/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌