OOM杀手不工作?
据我所知,当系统接近没有空闲内存时,内核应该开始杀死进程以重新获得一些内存。 但在我的系统中,这根本不会发生。
假设一个简单的脚本只分配比系统中可用内存多得多的内存(例如,一个包含数百万字符串的数组)。 如果我运行这样的脚本(作为普通用户),它只会获得所有内存,直到系统完全冻结(只有SysRQ REISUB工作)。
这里奇怪的部分是,当计算机冻结时,硬盘驱动器会打开并保持这种状态直到计算机重新启动,无论是否安装了交换分区!
所以我的问题是:
- 这种行为是否正常? 奇怪的是,作为普通用户执行的应用程序可能会以这种方式崩溃系统……
- 有什么方法可以让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有问题。