预加载 OOM Killer

预加载 OOM Killer

我的机器上没有任何交换分区/文件,只有 2GB RAM。

有时会发生内存被某些进程饱和的情况(奥格+浏览器+编译器+...)并且系统无限期地挂起,重新启动它的唯一方法(硬重置除外)是使用SysRq。

我明白了内存不足杀手对我没有帮助,因为当内存完全满时,内核无法分配 OOM Killer 本身。

有什么方法可以预加载 OOM Killer,以便在内存完全满时它可以真正工作吗?
或者是否可以调整内核,以便当我的内存已满时 OOM Killer 被激活${TOTAL_RAM} - 10MB

答案1

我相当确定内核为自己保留了一些内存,即用于启动 oom_killer。

(如果 oom_killer 由于内存不足而无法加载,那它还有什么用呢?)

答案2

内核确实分配了一个最小的本身的可用空间量。您可以通过以下方式查看该值:

$ sysctl vm.min_free_kbytes
vm.min_free_kbytes = 2842

$ cat /proc/sys/vm/min_free_kbytes
vm.min_free_kbytes = 2842

这个值依靠关于 RAM 的数量(在上面的情况下为 512MB),您可以尝试增加它,但我认为这不会解决您的问题(进一步会增加更快 OOM 的机会)。

OOM 杀手应该有足够的可用内存来杀死应用程序,否则它就会失去拥有内存的目的(就像克里斯已经指出的那样)。

编辑:顺便说一句,我认为仅通过修改内核参数(OOM 值)并不是解决用户空间程序问题的最佳方法。内核最了解正在发生的事情以及如何处理某些情况。不要使用这些值,而是尝试修复用户空间程序(Xorg、浏览器)生成的内存问题。另外,请参阅评论毫米/oom_kill.c源文件中,甚至内核开发人员也不认为 OOM 杀手在配置良好的环境中应该有很多工作要做。

答案3

避免这种情况的一种方法是关闭启发式过度使用处理并将其设置为不过度使用:设置 sysctl vm.overcommit_memory=2,然后降低 vm.overcommit_ratio。阅读本文在内核文档中

您还可以针对特定 PIDOOM的优惠待遇通过修改/proc/$PID/oom_adj。

答案4

系统无限期挂起

如果您想知道它为何挂起,请参阅答案到类似的问题

如果你想防止它挂起并在需要时几乎立即触发 OOM-killer,你可以尝试来自EDIT这个问题(注意:需要重新编译内核)。

相关内容