是否可以在强制交换时触发OOM杀手?


26

是否可以让系统抢先换出不活动的页面(vm.swappiness),但在系统内存不足(而不是内存不足)并被迫换盘时调用oom-killer?

最终目标是防止由于主要页面错误而使系统开始损坏磁盘时,系统不再处于停顿状态,但仍然让不活动的页面被换出。

另一个愿望是配置在强制关闭oom-killer之前强制系统使用多少交换内存。这样,只要距离不远,系统就可以进行少量交换。或者,我可以设置一个阈值以在使用所有RAM之前触发oom-killer,以便始终为文件系统缓存留出空间(从而避免更多的磁盘颠簸)。

似乎并不难做到。好像您可以告诉oom-killer在系统使用/免费的X ram时触发。但这就是为什么我要问。我不知道。

为了澄清起见,我不想关闭交换或调整vm.swappiness参数


3
有趣的是,即使没有交换文件,它也会发生。显然,只读内存映射文件(例如可执行文件,库,也许还有图形资源)被换出了。
WGH

Facebook的oomd是一个用户空间守护程序,旨在根据整体系统吞吐量(即仅在崩溃时)终止进程。但是,为台式机/工作站设置似乎很复杂(可能没有将任务放入cgroup或容器中)。
Jeffrey Bosboom

Answers:


22

我也为这个问题而苦苦挣扎。我只是希望我的系统无论如何都可以保持响应,并且我宁愿丢失进程也不愿等待几分钟。使用内核oom Killer似乎无法实现这一目标。

但是,在用户空间中,我们可以做任何我们想做的事情。所以我写了Early OOM Daemon(https://github.com/rfjakob/earlyoom),一旦可用RAM低于10%,它将杀死最大的进程(通过RSS)。

如果没有Earlyoom,通过多次启动http://www.unrealengine.com/html5/可以很容易地锁定我的机器(8GB RAM)。现在,有罪的浏览器选项卡在事情失控之前就被杀死了。


1
谢谢,这正是我想要的。我现在可以继续column -t -s,在一些巨大的csv文件上运行,并earlyoom在不可能的情况下将其杀死,然后再注意到任何无响应。
henfiber 2015年

4

这听起来像是一个过于复杂的解决方案。我建议(并且我在我安装的不需要休眠的计算机上执行此操作)仅分配少量交换空间(128-256MiB)。这样内核可以交换一些页面,但是OOM杀手会在情况恶化之前被调用。

如果您确实想执行此操作,我认为您需要编写自己的脚本/程序来监视交换使用情况,并使用Magic SysReq键调用OOM-killer (可以通过写入来编程完成/proc/sysrq-trigger)。


1
我认为进行少量交换并不是一个非常优雅的解决方案。您基本上最终限制了交换的用处。如果您有许多不活动的页面并且可以从10gb的交换中受益,该怎么办?我有约100GB的RAM的包装盒,其中10GB的交换并不是一个牵强的想法。编写应用程序在用户空间中执行此操作仅会遇到问题(与内核本身相比)。
Patrick

因为从那时起,您实质上需要一种机制来区分“良好交换”与“不良交换”,而这是很难设计的算法。显然,合适的交换量取决于RAM的数量和正在运行的工作负载,因此,如果10GiB适合您的计算机,则分配:-)
mgorven 2012年

为什么那会很难?只有两种类型的交换,由于的抢占式交换vm.swappiness和由于内存用完而导致的强制交换。所有需要发生的事情是当内核被迫交换以触发oom-killer时。10gb还留下了大量空间,可用于强制交换以破坏磁盘。
Patrick
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.