使用dmesg发现程序出现Out of memory的Case - 蝈蝈俊

💡 原文中文,约1700字,阅读约需5分钟。
📝

内容提要

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值,以避免在内存不足时被杀死,确保系统稳定性。

➡️

继续阅读