使用dmesg发现程序出现Out of memory的Case - 蝈蝈俊
内容提要
dmesg是Linux和Unix系统中的命令行工具,用于显示内核与系统硬件交互的消息。文章介绍了dmesg命令的使用方法和参数,以及oom_score_adj参数在内存不足时选择被杀死的进程。
延伸解读
从 dmesg 输出定位 OOM 事件
文章使用 dmesg -T | tail 查看最近内核消息,直接捕获到 OOM 杀进程记录。其中 -T 将时间戳转为人类可读格式,tail 聚焦最新日志。对运维人员而言,这提供了一种快速确认系统是否发生过内存不足的途径,无需额外工具。
解读被杀进程的内存指标
日志显示 website20240424 的 total-vm 约 2.38GB,但 anon-rss 仅约 574MB,file-rss 和 shmem-rss 均为 0。这说明虚拟内存总量大并不直接导致被杀,实际触发 OOM 的主要是匿名常驻内存。理解这些字段有助于判断进程真实内存压力来源。
oom_score_adj 如何影响进程存活
oom_score_adj 取值范围 -1000 到 +1000,默认 0。值越高越容易被 OOM 杀手选中。关键系统进程可设为较低值(如 -1000)以降低被杀风险。最终 oom_score 由内存使用量和该调整值共同决定,系统选择最高分进程终止。
dmesg 的管道过滤用法
文章提到 dmesg 输出可通过管道传给 grep 等命令,例如 dmesg | grep USB 查找 USB 相关消息。这提示读者在排查特定硬件或内核事件时,可结合过滤工具缩小范围,而不必逐行浏览全部内核日志。
Q&A
dmesg命令的主要功能是什么?
dmesg命令用于显示Linux和Unix系统中内核与硬件交互的消息。
如何使用dmesg命令查看最近的系统消息?
可以使用命令'dmesg -T | tail'来查看最近的系统消息,并以人类可读的时间戳格式呈现。
什么是oom_score_adj参数,它的作用是什么?
oom_score_adj是一个参数,用于决定在内存不足时哪个进程被杀死,值范围从-1000到+1000,值越高,进程被杀死的可能性越大。
在内存不足时,系统是如何选择被杀死的进程的?
系统根据进程的内存使用量和oom_score_adj值共同决定,选择oom_score最高的进程进行杀死。
dmesg命令的输出可以如何处理?
dmesg命令的输出可以通过管道传递给其他命令,如grep,以查找特定信息。
为什么某些关键进程的oom_score_adj值较低?
一些关键进程设置较低的oom_score_adj值,以避免在内存不足时被杀死,确保系统稳定性。