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?
我相当确定内核为自己保留了一些内存,即用于启动 oom_killer。
(如果由于内存不足而无法加载 oom_killer 有什么用?)
内核确实为自己分配了最少的可用空间。您可以通过以下方式查看此值:
$ 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杀手在配置良好的环境下应该有很多工作要做。