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

phe*_*mer 28 linux performance memory swap

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

最终目标是防止系统在由于主要页面错误而开始抖动磁盘时停止运行,但仍然让不活动的页面被换出。

另一个愿望是配置系统在 oom-killer 触发之前强制使用多少交换内存。这样系统就可以稍微进行交换,只要它不会走得太远。或者我可以在使用所有 RAM 之前设置这样一个阈值来触发 oom-killer,这样文件系统缓存总是有空间(从而避免更多的磁盘抖动)。

这似乎并不难做到。似乎您可以告诉 oom-killer 在系统使用/空闲 X ram 时触发。但这就是我问的原因;我不知道。

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

Jak*_*kob 25

我也在这个问题上挣扎。我只是想让我的系统保持响应,无论如何,我更喜欢丢失进程而不是等待几分钟。似乎没有办法使用内核 oom 杀手来实现这一点。

但是,在用户空间,我们可以为所欲为。因此,我编写了 Early OOM Daemon ( https://github.com/rfjakob/earlyoom ),一旦可用 RAM 低于 10%,它将终止最大的进程(通过 RSS)。

没有earlyoom,通过启动http://www.unrealengine.com/html5/几次很容易锁定我的机器(8GB RAM)。现在,有罪的浏览器标签会在事情失控之前被杀死。


mgo*_*ven 5

这听起来像是一个过于复杂的解决方案。我建议(我在我设置的不需要休眠的机器上这样做)只需分配少量交换空间(128-256MiB)。通过这种方式,内核可以交换一些页面,但是在事情变坏之前调用 OOM-killer。

如果您真的想这样做,我认为您需要编写自己的脚本/程序来监视交换使用情况并使用Magic SysReq 键调用 OOM-killer (可以通过写入以编程方式完成/proc/sysrq-trigger)。

  • 我认为进行小额交换并不是一个非常优雅的解决方案。您基本上最终限制了交换的有用性。如果您有很多非活动页面并且可以从 10GB 交换空间中受益怎么办?我有大约 100GB 内存的盒子,其中 10GB 交换空间并不是一个牵强的想法。编写一个应用程序在用户空间中执行此操作很容易出现问题(与内核中的本机相比)。 (2认同)
  • 因为这样你本质上需要一种机制来区分“好交换”和“坏交换”,这是一个很难设计的算法。合适的交换量显然取决于 RAM 量和您正在运行的工作负载,因此,如果 10GiB 适合您的计算机,则分配它:-) (2认同)