如何再次给OOM杀手咬牙?


12

过去,我曾经诅咒OOM杀手,因为它们过于激进并杀死了我正在使用的应用程序。现在,由于某些程序的不正常运行,我会定期观察系统故障,持续15分钟,然后由于无法响应键盘而最终诉诸于强制关机,我意识到自己的表现比我想象的要好那时。

如何将OOM杀手恢复到古老的嗜血方式?


1
看一下引起问题的程序,并限制它们可能占用的内存量limits.conf
LawrenceC

Answers:


4

我会减少可用交换空间的数量。这些天的典型安装尝试分配与物理内存一样多的交换(有时是两倍)。这样做的问题是,当事情出现差错,系统将进入试图从内存到磁盘,然后回到“洗牌”的东西的死亡螺旋,并开始做这么多的它没有时间回应用户输入。

在正常情况下,整个过程都换出到磁盘上(然后又换回来),因此需要进行大量交换。

在现代虚拟内存系统中,内存是按块(而不是整个进程)交换出去的,因此您可以通过较小的交换来解决问题。在您的方案中,最好将进程杀死,因此以较小的交换运行将使OOM更快地开始终止进程​​(而不是让系统花费过多的时间将事物交换到磁盘或从磁盘交换数据)。


我的交换次数为零,当我在铬中有一个无限的javascript循环而不是推送到数组或其他东西上时,系统锁定20分钟以上。我需要OOMK在我的系统无效之前触发,而不是在此之后。
JasonWoof

0

这对我有用:

echo 1 > /proc/sys/vm/oom_kill_allocating_task

那只是为了这个引导。您可以通过在浏览器检查器的控制台选项卡中运行以下命令进行测试:

a = []; while (true) { a.push(1); }

如果您对此设置感到满意,则可以为以后的所有启动设置默认值:

echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf
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.