答案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 杀手在配置良好的环境中应该有很多工作要做。