![是否有可能在强制交换时触发 OOM-killer?](https://linux22.com/image/23010/%E6%98%AF%E5%90%A6%E6%9C%89%E5%8F%AF%E8%83%BD%E5%9C%A8%E5%BC%BA%E5%88%B6%E4%BA%A4%E6%8D%A2%E6%97%B6%E8%A7%A6%E5%8F%91%20OOM-killer%EF%BC%9F.png)
是否可以让系统先发制人地换出非活动页面 ( vm.swappiness
),但在系统耗尽 RAM(而不是耗尽内存)并被迫交换时调用 oom-killer?
最终目标是防止系统因主要页面错误而开始破坏磁盘时停止运行,但仍让不活动页面被换出。
另一个愿望是配置系统在 oom-killer 触发之前强制使用多少交换内存。这样,系统就可以稍微使用交换空间,只要它不太多。或者我可以设置这样一个阈值,在使用所有 RAM 之前触发 oom-killer,这样总会有空间用于文件系统缓存(从而避免更多的磁盘抖动)。
看起来这件事并没有那么难做到。看起来你可以告诉 oom-killer 在系统使用/空闲 X ram 时触发。但这就是我要问的原因;我不知道。
为了澄清起见,我不想关闭交换或调整vm.swappiness
参数
答案1
我也为这个问题苦苦挣扎。无论如何,我只是希望我的系统保持响应能力,而且我宁愿丢失进程也不愿等待几分钟。似乎没有办法使用内核 oom Killer 来实现这一点。
然而,在用户空间,我们可以为所欲为。所以我写了早期的 OOM 守护进程(https://github.com/rfjakob/earlyoom)一旦可用 RAM 低于 10%,就会终止最大的进程(通过 RSS)。
如果没有earlyoom,通过启动很容易锁定我的机器(8GB RAM)http://www.unrealengine.com/html5/几次。现在,有罪的浏览器选项卡在事情失控之前就被杀死了。
答案2
这听起来像是一个过于复杂的解决方案。我建议(我在我设置的不需要休眠的机器上执行此操作)简单地分配少量交换空间(128-256MiB)。这样,内核可以交换一些页面,但 OOM-killer 会在事情变得糟糕之前被调用。
如果你真的想这样做,我认为你需要编写自己的脚本/程序来监视交换使用情况并使用以下命令调用 OOM-killer神奇的 SysReq 密钥(可以通过写入 来以编程方式完成/proc/sysrq-trigger
)。