为什么 OOM killer 没有捕获明显行为不当的进程?

为什么 OOM killer 没有捕获明显行为不当的进程?

在 CentOS 7(使用 3.10 内核)服务器上,我惊讶地发现 mysqld 进程被“oom 终止”。原因很明显,我有时会运行一个非常耗内存的进程(WebTorrent),有时会发展成一个令人厌恶的进程(看起来像内存泄漏)。我对此没有意见,只要在发生这种情况时将其终止即可。在另一个系统(Debian 11)上,这是实际行为,但在较旧的 CentOS 7 上,其他进程被终止,我不明白为什么不终止最明显的进程?

来自日志(仅选定的行):

Apr 20 09:12:57 vps001 kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Apr 20 09:12:58 vps001 kernel: Out of memory (oom_kill_allocating_task): Kill process 996 (mysqld) score 0 or sacrifice child
Apr 20 09:12:58 vps001 kernel: Killed process 918 (mysqld), UID 27, total-vm:2184052kB, anon-rss:18492kB, file-rss:0kB, shmem-rss:0kB
--
Apr 20 09:26:40 vps001 kernel: in:imjournal invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Apr 20 09:26:40 vps001 kernel: Out of memory (oom_kill_allocating_task): Kill process 663 (in:imjournal) score 0 or sacrifice child
Apr 20 09:26:40 vps001 kernel: Killed process 653 (rsyslogd), UID 0, total-vm:308640kB, anon-rss:340kB, file-rss:0kB, shmem-rss:156kB
--
Apr 20 09:26:40 vps001 kernel: tmux invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Apr 20 09:26:41 vps001 kernel: Out of memory (oom_kill_allocating_task): Kill process 23040 (tmux) score 0 or sacrifice child
Apr 20 09:26:41 vps001 kernel: Killed process 23041 (bash), UID 0, total-vm:115680kB, anon-rss:0kB, file-rss:4kB, shmem-rss:0kB
--
Apr 20 09:26:41 vps001 kernel: node invoked oom-killer: gfp_mask=0x200da, order=0, oom_score_adj=0
Apr 20 09:26:41 vps001 kernel: Out of memory (oom_kill_allocating_task): Kill process 23241 (node) score 0 or sacrifice child
Apr 20 09:26:41 vps001 kernel: Killed process 23239 (WebTorrent), UID 1000, total-vm:14750096kB, anon-rss:1618448kB, file-rss:0kB, shmem-rss:0kB

由于我无法理解的原因,在好的进程之前有 3 个进程被终止。

我期望的事情:

  • 消耗最多内存的进程被杀死
  • UID 为 0 的进程不会在其他 UID 之前被终止
  • UID 27 比 UID 1000 更“重要”

我希望更好地理解 OOM 行为,特别是为什么我的所有假设都是错误的。

答案1

阅读内核源代码后我明白了,这很明显: oom_kill_allocating_task意味着不进行任何扫描并且询问进程被终止。

这不是默认行为,我已经在某处通过 sysctl 配置对其进行了设置:

vm.oom_kill_allocating_task = 1

所以我肯定是很久以前就设定了它,而没有意识到后果。感谢您的评论。

相关内容