OOM杀手不工作?

据我所知,当系统接近没有空闲内存时,内核应该开始杀死进程以重新获得一些内存。 但在我的系统中,这根本不会发生。

假设一个简单的脚本只分配比系统中可用内存多得多的内存(例如,一个包含数百万字符串的数组)。 如果我运行这样的脚本(作为普通用户),它只会获得所有内存,直到系统完全冻结(只有SysRQ REISUB工作)。

这里奇怪的部分是,当计算机冻结时,硬盘驱动器会打开并保持这种状态直到计算机重新启动,无论是否安装了交换分区!

所以我的问题是:

  1. 这种行为是否正常? 奇怪的是,作为普通用户执行的应用程序可能会以这种方式崩溃系统……
  2. 有什么方法可以让Ubuntu在他们获得太多(或最多)内存时自动杀死那些应用程序?

附加信息

  • Ubuntu 12.04.3
  • 内核3.5.0-44
  • 内存:从4GB到大约3.7GB(与显卡共享)。 *

    $ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory  /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1 

从官方/proc/sys/vm/*文档 :

oom_kill_allocating_task

这启用或禁用在内存不足情况下终止OOM触发任务。

如果将其设置为零,则OOM杀手将扫描整个任务列表并根据启发式选择要杀死的任务。 这通常会选择一个流氓内存占用任务,可以在被杀死时释放大量内存。

如果将此值设置为非零,则OOM杀手只会杀死触发内存不足情况的任务。 这避免了昂贵的任务列表扫描。

如果选择了panic_on_oom,则它优先于oom_kill_allocating_task中使用的任何值。

默认值为0。

总而言之,当将oom_kill_allocating_task设置为1 ,内核只会杀死导致系统内存不足的进程,而不是扫描你的系统寻找要杀死的进程,这是一项昂贵且缓慢的任务。

根据我自己的经验,当触发OOM时,内核没有足够的“强度”足以进行此类扫描,从而使系统完全无法使用。

此外,更明显的是杀死导致问题的任务,所以我无法理解为什么默认设置为0

对于测试,您只需在/proc/sys/vm/写入正确的伪文件,该文件将在下次重新启动时撤消:

 echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task 

要进行永久性修复,请将以下内容写入/etc/sysctl.conf/etc/sysctl.conf下的新文件,扩展名为.conf (例如/etc/sysctl.d/local.conf ):

 vm.oom_kill_allocating_task = 1 

更新:错误已修复。

Teresa的答案足以解决问题并且很好。

另外,我已经提交了一个错误报告: https : //bugs.launchpad.net/ubuntu/+source/linux/+bug/1359766

因为这绝对是一种破碎的行为。

首先,我建议更新到13.10(干净安装,保存数据)。

如果您不想更新,请将vm.swappiness更改为10,如果您发现ram install zRAM有问题。