OOM杀手无法正常工作?


41

据我了解,当系统接近没有可用内存时,内核应开始终止进程​​以重新获得一些内存。但是在我的系统中这根本不会发生。

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

奇怪的是,当计算机死机时,无论是否安装了交换分区,硬盘驱动器指示灯都会打开并一直保持这种状态,直到计算机重新启动为止!

所以我的问题是:

  1. 这是正常现象吗?奇怪的是,以普通用户身份执行的应用程序可能会以这种方式使系统崩溃...
  2. 有什么办法可以使Ubuntu在内存过多(或最多)时自动杀死那些应用程序?

附加信息

  • Ubuntu 12.04.3
  • 内核3.5.0-44
  • RAM:4GB到3.7GB(与图形卡共享)。*

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

我不确定为什么它不起作用。尝试tail -n+1 /proc/sys/vm/overcommit_*添加输出。另请参阅此处:如何配置oom-killer
kiri 2014年

那么交换空间发生了什么?您可以张贴一些vmstat输出,例如#vmstat 1100或类似的东西吗?并向我们​​展示cat / etc / fstab应该发生的情况是在一定的内存使用量下,您应该开始写swap。在内存和交换空间“满”之前,不应该终止进程。
2014年

也尝试#swapon -a
j0h 2014年

@ j0h使用swap似乎运行良好(一段时间后,该进程崩溃,出现类似的错误Allocation failed)。但是,如果不进行交换,它将冻结计算机。应该以这种方式工作(仅在使用swap时杀死)吗?
塞勒姆2014年

2
使用SysRq,您还可以调用OOM(SysRq + F iirc)
Lekensteyn 2014年

Answers:


36

官方/proc/sys/vm/*文档中

oom_kill_allocating_task

这在内存不足的情况下启用或禁用杀死OOM触发任务。

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

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

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

默认值为0。

为了总结,当设置oom_kill_allocating_task1,而不是扫描您的系统寻找过程杀,这是一个昂贵的和缓慢的任务,内核只会杀死导致系统得到的内存溢出的过程。

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

此外,杀死导致问题的任务会更加明显,因此我无法理解为什么0默认情况下将其设置为默认值。

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

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

对于一个永久性的修复,写入以下内容/etc/sysctl.conf或到一个新的文件下/etc/sysctl.d/,具有.conf扩展名(/etc/sysctl.d/local.conf例如):

vm.oom_kill_allocating_task = 1

2
在Ubuntu中是否总是将其设置为0?因为我记得它曾经自动杀死,但是由于一些版本,它不再这样做。
skerit 2014年

1
@skerit我不太清楚,但是在我2010年使用的内核(Debian,Liquorix和GRML)中将其设置为0。
Teresa e Junior

“而且,更简单的是杀死导致问题的任务,因此我无法理解为什么0默认情况下将其设置为。” -因为请求内存的进程不一定是“导致问题”的进程。如果进程A占用了系统内存的99%,但是进程B(占用0.9%的内存)恰好是因运气不好而触发OOM杀手的进程,那么B并没有“引起问题”,因此杀死B。由于不同的进程对内存的使用失控,该策略可能会导致毫无问题的低内存进程被偶然杀死。
Mark Amery

1
@MarkAmery真正的问题是,Linux不仅终止了所需的进程,而且开始缓慢运行,即使延迟vm.admin_reserve_kbytes增加到128 MB。设置vm.oom_kill_allocating_task = 1似乎可以缓解问题,但并不能真正解决(默认情况下,Ubuntu已经处理了叉子炸弹)。
Teresa e Junior

1
也许更优雅sudo sysctl -w vm.oom_kill_allocating_task=1
Pablo A

9

更新:该错误已修复。

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

另外,我已经提交了一个错误报告,因为这肯定是错误的行为。


我不知道你为什么被低估,但这对我来说听起来像是一个内核错误。今天,我已经将一台大型大学服务器与之相撞,并杀死了运行了数周的某些进程...不过,感谢您提交该错误报告!
shapecatcher 2014年

7
可能已在2014年修复,在2018年(和18.04年),OOM杀手再次无所作为。
skerit

0

您可以尝试Earlyoom,它是在用户空间中运行的OOM杀手,可以尝试杀死OOM情况下最大的进程。


-1

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

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


2
我并不是打败您的人,但总的来说,降低vm.swappiness弊大于利,在内存不足问题的系统上甚至更大。
Teresa e Junior

并非如此,当您首先压缩ram时,然后避免使用磁盘,因为磁盘使用速度慢得多,并且可能会使计算机冻结。
Brask 2014年

从理论上讲,zRAM是一件好事,但它占用CPU太多,通常不值得花这笔钱。内存通常比电便宜。并且,在笔记本电脑上,升级RAM的成本更高,CPU使用率通常是不可取的。
Teresa e Junior

他要求的是拥有一个更稳定的系统zRAM,并且更改swappiness将使他的系统使用更多的CPU资源。但是,他受atm限制并且存在内存错误,他想解决问题而不是理论课安装zRAM时发生的情况。
Brask 2014年

从他的问题中可以明显看出,他可能编写了不正确的脚本,吃得比应有的要多(我自己已经做过)。在这种情况下,您可以看到脚本在几秒钟内抢占了GB的RAM,而zRAM则无法挽救,因为脚本将永远无法满足。
Teresa e Junior
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.