预加载 OOM 杀手

peo*_*oro 4 linux kernel memory

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

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

我知道Out Of Memory Killer不会帮助我,因为当内存完全满时,内核无法分配 OOM Killer 本身。

有没有办法预加载OOM Killer,让它在内存完全满的情况下真正工作?
或者是否可以调整内核以便在我的 ram 已满时激活 OOM Killer ${TOTAL_RAM} - 10MB

chr*_*ris 7

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

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

  • oom 杀手只是试图猜测谁对内存不足负责。您可以设置浏览器的 oomadj 值以确保它被 oom (/proc/<pid>/oomadj) 杀死。 (2认同)

wag*_*wag 6

内核确实为自己分配了最少的可用空间。您可以通过以下方式查看此值:

$ sysctl vm.min_free_kbytes
vm.min_free_kbytes = 2842

$ cat /proc/sys/vm/min_free_kbytes
vm.min_free_kbytes = 2842
Run Code Online (Sandbox Code Playgroud)

此值取决于RAM 量(在上述情况下为 512MB),您可以尝试增加它,但我认为这不会解决您的问题(还会增加更快出现 OOM 的机会)。

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

编辑:作为旁注,我认为这不是解决有关用户空间程序的问题的最佳方法,仅通过修改内核参数(OOM 值)即可。内核最了解正在发生的事情以及如何处理某些情况。与其使用这些值,不如尝试修复用户空间程序(Xorg、浏览器)产生的内存问题。还有,看mm/oom_kill.c源文件的评论,连内核开发者都不会认为OOM杀手在配置良好的环境下应该有很多工作要做。