为什么 OOM-Killer 不能直接杀死要求太多的进程?

为什么 OOM-Killer 不能直接杀死要求太多的进程?

这里解释一下:Linux 会开始杀死我的进程而不询问我内存是否不足吗?OOM-Killer 可以通过overcommit_memory以下方式进行配置:

  • 2 = 没有过度使用。如果要求太多,分配就会失败。
  • 0, 1 = 过度使用(启发式或始终)。杀一些当实际访问过多内存时,基于一些启发式的进程。

现在,我可能完全误解了这一点,但为什么没有一个选项(或者为什么不是默认选项)来终止实际上尝试访问其分配的过多内存的进程?

答案1

考虑这种情况:

  • 您有 4GB 可用内存。
  • 有故障的进程分配 3.999GB。
  • 您打开任务管理器来终止失控的进程。任务管理器分配0.002GB。

如果被杀死的进程是最后一个请求内存的进程,那么您的任务管理器将被杀死。

或者:

  • 您有 4GB 可用内存。
  • 有故障的进程分配 3.999GB。
  • 您打开任务管理器来终止失控的进程。 X 服务器分配 0.002GB 来处理任务管理器的窗口。

现在你的 X 服务器被杀死了。

它并没有引起问题;这只是“在错误的时间出现在错误的地点”。它恰好是在没有剩余内存的情况下第一个分配更多内存的进程,但它并不是一开始就使用了所有内存的进程。

答案2

这个问题已经困扰我很长时间了,我发现全能的“Linux 捍卫者”都在鼓吹 OOM Killer 是有史以来发明的终极工具。 (我想知道这些人中的大多数是否每天都使用 Linux,因为他们的言论听起来与我在现实中看到的相距甚远......)

根据我的经验(很多次死机和崩溃、硬重启和很多痛苦、浪费的时间永远无法挽回),我对 OOM Killer 的理解是它已经坏了,它不起作用,而且它在本质上有缺陷它的设计方式是因为(正如原始文章提到的)它不会杀死主要的罪犯(分配更多内存的应用程序,就像 Windoze 那样......)相反,它会杀死主要大进程周围的进程,这不会带来任何影响。无论如何结果。

对我来说,这个 Linux OOM Killer 看起来像是早在计算机内存还不到 128 MB、互联网浏览器出现之前就设计出来的东西。以今天的标准来看,这是不切实际且无用的。

这些命令应该对您分配键盘快捷键很有用:

首先,使用以下命令测试要终止的进程:

ps aux | grep STRING
ps aux | grep PORTION_OF_NAME_WITHOUT_QUOTES_OR_SPACES

如果它显示您要终止的进程,请将其放入下面的脚本中的括号内。

#!/bin/bash
#
kill -9 $(ps aux | grep type=renderer)
# the above will kill all my Chromium processes
# without having to restart my entire browser or losing progress
# incognito window will be kept alive, instead of lost
#
sudo killall tumblerd
# (optional)

或者甚至更好:

sudo apt remove tumbler

相关内容