以前我经常诅咒 OOM 杀手过于激进,会杀死我正在使用的应用程序。现在,当我定期看到我的系统因为一些行为不当的程序而崩溃 15 分钟,最后因为无法响应键盘而强制关机时,我意识到我的情况比当时要好。
我怎样才能让 OOM-killer 恢复其原来嗜血的样子?
答案1
我会减少可用的交换空间量。如今的典型安装会尝试分配与物理内存一样多的交换空间(有时是两倍)。这样做的问题是,当出现问题时,系统会陷入死循环,试图将内容从内存“移动”到磁盘,然后再移动回来,然后开始执行所以大部分那它没有时间响应用户输入。
在过去的好日子里,整个过程被交换到磁盘(并交换回来),因此需要大量的交换。
在现代虚拟内存系统中,内存是按块(而不是整个进程)交换的,因此您可以使用较小的交换。在您的场景中,最好终止进程,因此使用较小的交换运行将导致 OOM 更快地开始终止进程(而不是让系统花费过多的时间将内容交换到磁盘或从磁盘交换内容)。
答案2
以下是对我有用的方法:
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
答案3
安装 earlyoom ,它可从 github 获取,也可以从我目前使用的 ubuntu 发行版中的 apt 安装。这是一个完全可配置的守护进程,可在事情失控之前进行干预,并且你可以决定触发终止的可用 RAM 和/或交换的百分比。