有什么方法可以防止 Linux 交换任何事物而是当物理 RAM 耗尽时直接进入 OOM killer?
背景
我有一台 Linux 工作站,它偶尔会耗尽内存。发生这种情况时,它将无法恢复。(无论是否启用交换,情况都是如此,我见过这两种情况。)
在这种情况下,我希望 OOM 终止程序开始终止进程并持续执行,直到系统恢复或崩溃(两者之一,或两者之间的任何情况,都比无限期挂起要好)。有趣的是,即使禁用交换也不会发生这种情况,而是系统会给出正在交换的指示(东西可以工作,只是速度要慢几个数量级)。
我目前的理论是,Linux 仍在交换它认为由磁盘支持的数据,例如可执行文件和 mmap 文件的只读页面。
注意:我已经花费了一些精力,尝试了多种限制内存使用的技术。如果不妨碍正常运行,我做不了更多了。我真的在寻找一种“杀死它们,让用户自己解决”的解决方案。
答案1
我不知道这是否适用于所有 Linux 发行版。
使进程不太可能被杀死。nnn = pid
echo -15 > /proc/nnn/oom_adj
我们可以通过执行以下操作使 OOM 终止程序更有可能终止 nnn 进程。
echo 10 > /proc/nnn/oom_adj
然而。
在我看来,这听起来不是一个很好的解决方案。在考虑这种事情之前,我会做一些限制进程资源的事情。ulimit 就是出于这个原因。如果您已经这样做了,这不会使您当前的方法无效。但我想它确实回答了这个问题。它需要你:
监控事物并采取行动以杀死
如果您“知道”没有某样东西您也能活下去,那么请先验地采取这种终止方法。这引发了一个问题 - 如果您没有它也能活下去,那么为什么要运行该进程?