Linux中如何通过Dmesg -T追踪物理内存溢出触发的OOM-Killer进程终止详情?
- 内容介绍
- 文章标签
- 相关推荐
本文共计694个文字,预计阅读时间需要3分钟。
使用 `mesg -T | grep -i killed process | out of memory` 命令可以直接捕获 OOM Killer 杀死进程的核心记录。但要真正理解谁被杀、为什么杀、系统当时多紧张,需要结合时间、上下文和内存状态一起分析。
快速定位杀进程的原始日志
OOM 事件发生后,内核只在 ring buffer 写一次关键信息,不持久化。必须立刻执行:
- sudo dmesg -T | grep -i "killed process\|out of memory" —— 最简有效命令,-T 输出本地可读时间(如 [Wed Apr 10 09:22:17 2026]),避免相对秒数难定位
- 典型输出含:PID、进程名(如 python3)、total-vm(虚拟内存)、anon-rss(真实物理内存占用,最关键)
- 若无输出,不是没发生,而是缓冲区已被刷掉,或普通用户权限受限(RHEL/CentOS 8+ 默认 kernel.dmesg_restrict=1)
查上下文:光看“被杀”不够,要看“为啥杀”
OOM 是结果,不是起点。前几秒往往有页分配失败、内存压缩压力等线索:
- sudo dmesg -T | tail -n 200 —— 查最近 200 行,人工找 “Out of memory” 前后的 page allocation failure、low memory、free: 等关键词
- sudo dmesg -T --level=err,warn | tail -50 —— 聚焦错误与警告,过滤噪音
- 若系统启用了 kdump 或 syslog 归档,可补查:sudo journalctl -k --grep="oom\|out.of.memory" --since="2 hours ago"
结合内存状态交叉验证
单看 dmesg 是“断案”,查 /proc 才算“验尸”:
- 运行时执行:cat /proc/meminfo | grep -E "(MemAvailable|SwapFree|Committed_AS)" —— 看当时真实可用内存是否已见底
- 若进程在容器中:cat /sys/fs/cgroup/memory/xxx/memory.limit_in_bytes 和 memory.usage_in_bytes 才是触发点,dmesg 不体现 cgroup 边界
- 查内存压力:cat /proc/pressure/memory —— 若 avg10 长期 > 5,说明系统持续承压
分析被杀依据:不是内存最大,而是“最该杀”
内核选进程靠 oom_score_adj 综合评估,不是简单比 RSS:
- 查被杀进程当时的调整值:sudo cat /proc/18942/oom_score_adj(替换为实际 PID)
- 对比同类进程:ps -eo pid,comm,oom_score_adj --sort=-oom_score_adj | head -10
- 注意默认规则:root 进程 = -1000(免疫),Docker 容器默认 +1000(优先杀),Java 应用常被手动设高分保其他服务
本文共计694个文字,预计阅读时间需要3分钟。
使用 `mesg -T | grep -i killed process | out of memory` 命令可以直接捕获 OOM Killer 杀死进程的核心记录。但要真正理解谁被杀、为什么杀、系统当时多紧张,需要结合时间、上下文和内存状态一起分析。
快速定位杀进程的原始日志
OOM 事件发生后,内核只在 ring buffer 写一次关键信息,不持久化。必须立刻执行:
- sudo dmesg -T | grep -i "killed process\|out of memory" —— 最简有效命令,-T 输出本地可读时间(如 [Wed Apr 10 09:22:17 2026]),避免相对秒数难定位
- 典型输出含:PID、进程名(如 python3)、total-vm(虚拟内存)、anon-rss(真实物理内存占用,最关键)
- 若无输出,不是没发生,而是缓冲区已被刷掉,或普通用户权限受限(RHEL/CentOS 8+ 默认 kernel.dmesg_restrict=1)
查上下文:光看“被杀”不够,要看“为啥杀”
OOM 是结果,不是起点。前几秒往往有页分配失败、内存压缩压力等线索:
- sudo dmesg -T | tail -n 200 —— 查最近 200 行,人工找 “Out of memory” 前后的 page allocation failure、low memory、free: 等关键词
- sudo dmesg -T --level=err,warn | tail -50 —— 聚焦错误与警告,过滤噪音
- 若系统启用了 kdump 或 syslog 归档,可补查:sudo journalctl -k --grep="oom\|out.of.memory" --since="2 hours ago"
结合内存状态交叉验证
单看 dmesg 是“断案”,查 /proc 才算“验尸”:
- 运行时执行:cat /proc/meminfo | grep -E "(MemAvailable|SwapFree|Committed_AS)" —— 看当时真实可用内存是否已见底
- 若进程在容器中:cat /sys/fs/cgroup/memory/xxx/memory.limit_in_bytes 和 memory.usage_in_bytes 才是触发点,dmesg 不体现 cgroup 边界
- 查内存压力:cat /proc/pressure/memory —— 若 avg10 长期 > 5,说明系统持续承压
分析被杀依据:不是内存最大,而是“最该杀”
内核选进程靠 oom_score_adj 综合评估,不是简单比 RSS:
- 查被杀进程当时的调整值:sudo cat /proc/18942/oom_score_adj(替换为实际 PID)
- 对比同类进程:ps -eo pid,comm,oom_score_adj --sort=-oom_score_adj | head -10
- 注意默认规则:root 进程 = -1000(免疫),Docker 容器默认 +1000(优先杀),Java 应用常被手动设高分保其他服务

