前几天我了解到,如果 Linux 内存不足,它确实会杀死进程。在此之前我已经使用 swapoff 命令分离了交换。通常,如果任何进程因错误占用了所有内存,例如循环中的内存泄漏,我的系统就会挂起(我知道,从技术上讲,它真的很慢),而不是杀死坏进程。
我该如何防止这种情况?没有软件是完美的,我会运行编码很差的程序并时不时地遇到这个问题。我每次都必须重置系统。这只是现代内核的限制吗?我不能只是关闭交换,因为我知道内核在某种程度上利用其交换来有效地利用物理内存,即使物理内存很宽敞。
使用较小的交换空间可能是一种选择(OOM 之前的时间较短)。
答案1
内核的内存不足Killer 被用作最后的手段。如果您为正在运行的进程提供足够的内存和/或交换空间,那么它将不会被触发。
当您的系统耗尽物理内存时,它将开始使用交换空间。从此时开始,速度会开始减慢,有时甚至会急剧减慢。如果您有足够多的活动进程尝试使用相同的物理内存,您的系统将开始花费比实际运行它们更多的时间来换入和换出它们。
当交换空间接近耗尽时,内核将开始杀死进程,以保持其他进程的运行。我不需要调查 OOMK 用于选择流程的标准,因此我无法在这里向您描述它们。
解决方案是以下一种或多种
- 添加更多物理内存
- 添加更多(或一些)交换。这可以是磁盘分区或文件
- 减少正在运行的进程的数量或大小
- 修复内存失控的进程中的代码
其他一些参考
可以对每个进程可以使用的内存量设置限制。当它试图超过这个值时,分配请求就会失败。通常,这会导致程序崩溃,要么以不受控制的方式崩溃,因为它没有测试分配请求的返回值,要么以受控的方式崩溃,并出现致命异常。
答案2
这是一个老问题,困扰了我很长一段时间。根据我使用 Linux 的经验,它的 OOM 杀手已经损坏。这是行不通的。 Chromium浏览器,它不会杀死。其他进程,它不会杀死。今天早上,Tumblerd 进程使用 2.1 GB 几乎使我的系统崩溃。即使在一个令人痛苦、可怕的冻结系统上等待了 3 分钟(由于我下面的键盘快捷键,它幸存下来),Linux 也没有使用 2.1 GB 杀死该进程,这进一步证明它不起作用。
我不是来这里问任何人它是否有效,所以把你的打字留给其他人吧。平常的 bla bla bla...(多么粗鲁)
我能够解决此问题的唯一方法是始终使用 free -h 监视可用内存,否则我可能会错过短暂的时间阈值,整个系统会被冻结,从而导致硬重置。我在 XFCE 上为一个脚本设置了一个键盘快捷键,该脚本将杀死我的所有 Chromium 进程,这对于我的特定用例来说已经足够了。但如果我能找到一种方法来“杀死使用最多内存的进程”(由于今天早上早些时候发生的上述冻结,我目前正在搜索该进程),那就更好了
首先,使用以下命令测试要终止的进程:
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
#
killall tumblerd
# (optional)
将其粘贴到一个空文本文件中并将其另存为 SOMETHING.SH 然后通过运行 chmod a+x /path/to/SOMETHING.SH 使其可执行并将其分配给键盘快捷键(在 XFCE 中是可能的)
对于 tumblerd 进程,避免问题的最佳方法是将其从系统中删除,因为它只负责生成视频缩略图。
sudo apt remove tumbler
因此,对于正在阅读本文的任何人来说,如果您怀疑 Linux 的 OOM 杀手已损坏,那么您没有错,不要让其他人因为您的想法而感到内疚。
编辑:我的错误是,避免在热键激活的脚本中使用 sudo,否则脚本的其余部分将无法运行,因为只有直接从终端运行时,它才不会提示输入密码。