导航

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

Posted on 2024-04-28 08:45  蝈蝈俊  阅读(19)  评论(0编辑  收藏  举报

dmesg(display message)是Linux和Unix系统中的一个命令行工具,用于显示内核与系统硬件交互的消息。运行此命令可能会显示一些关于系统错误或崩溃的信息:

我使用了下面命令,

dmesg -T | tail

参数说明:

  • -T:显示人类可读的时间戳,而不是默认的自系统启动以来的秒数。

发现了下面情况:

[Fri Apr 26 10:22:44 2024] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-0.slice/session-6695.scope,task=website20240424,pid=1508765,uid=0

[Fri Apr 26 10:22:44 2024] Out of memory: Killed process 1508765 (website20240424) total-vm:2380796kB, anon-rss:574076kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:1328kB oom_score_adj:0

从上面输出信息来看,website20240424这个程序在被杀时占用的内存信息包括:

  • total-vm:2380796kB:这表示程序占用的虚拟内存总量是2380796kB,约为2.38GB
  • anon-rss:574076kB:这表示程序占用的匿名常驻内存(不包括交换空间的内存)是574076kB,约为574MB
  • file-rss:0kB、shmem-rss:0kB:表示程序从文件映射和共享内存中占用的内存都为0kB

从这些数据可以看出,主要的内存占用来自于匿名常驻内存(anon-rss),约为574MB。由于内存不足,操作系统内存管理器触发了“Out of memory”(内存不足)的处理机制,选择了oom_score_adj值为0的这个进程进行kill,以释放内存资源。

oom_score_adj

oom_score_adj(OOM得分调整值)是Linux操作系统中一个用来决定当系统内存不足时哪个进程将被杀死的参数。这个值可以帮助操作系统的Out-Of-Memory(OOM)杀手决定在多个候选进程中哪个最应该被终止以释放内存。

oom_score_adj 的工作机制:

  • 数值范围oom_score_adj的取值范围从-1000到+1000。值越高,表示进程越有可能被OOM杀手选中杀死。
  • 默认值:大多数普通进程的oom_score_adj是0。这个值可以通过特定的系统接口进行调整,以表示某些进程比其他进程更重要或者更不重要。
  • 特殊情况:一些关键的系统进程可能会设置一个较低的oom_score_adj(比如-1000),使其在内存不足时尽量不被杀死。
  • 影响因素:进程使用的内存量oom_score_adj值共同决定了一个进程的oom_score。系统会选择oom_score最高的进程进行杀死。

dmesg 常用参数和用法

dmesg 命令的输出可以通过管道传递给其他命令,如 grep,以帮助你查找特定的信息。例如,查找与 USB 设备相关的消息:

dmesg | grep USB

常用选项

  • -H:开启人类可读的输出模式,使用彩色输出,并且消息会根据时间戳进行分组。
  • -w:实时监控新的内核消息。
  • -T:显示人类可读的时间戳,而不是默认的自系统启动以来的秒数。
  • -c:显示消息后清除内核的环形缓冲区。这个选项需要管理员权限。