逃离 Linux 中的 OOM 杀手

逃离 Linux 中的 OOM 杀手

经过一番研究,我发现可以通过在 /proc/pid/oom_adj 中插入一个值来调整甚至使某些进程免受 OOM 杀手的侵害,我当然需要使用 pidof 或 pgrep 或类似的东西来找到我的进程的 pid,并制作一个脚本,在我的所有进程启动并运行后运行该脚本。

OOM 杀手的问题和其他杀手一样,表面上看似理智、理性,但内心深处却非常混乱、疯狂,常常无法做出正确判断。

现在我个人并不介意进行一些杀戮,只要我知道发生了什么,并对受害者有一定的控制权(大家冷静一下,我说的是计算机方面的东西),所以我正在寻找一种更好的方法来保护某些进程免受可怕的 OOM 杀手的侵害,这样我就不必在每次运行所有程序或启动新程序时都运行脚本。有什么想法可以轻松实现这一点吗?

答案1

您不应该依赖 OOM 杀手来管理您的进程。当唯一的其他选择是系统崩溃时,OOM 杀手是最后的手段。例如,所有缓存和磁盘缓冲区内存都已刷新并提交,所有可以换出/丢弃的内容都已处理,但您仍然没有足够的内存……显然,您不希望正在运行的系统达到这种状态。

由于 OOM 杀手在运行时受到严格限制(不能分配更多内存,不能在其他进程中交换等),它将要杀死您不想被杀死的进程以减轻内存压力。

我认为如果您的系统没有足够的内存,您需要添加更多内存或交换空间,这取决于您是否耗尽了物理内存或总虚拟内存。

另一方面,如果由于内存泄漏或其他错误,您有几个失控进程不时消耗过多内存,则您可以通过其他方式控制:

  1. 在启动有问题的进程之前设置ulimit -m并限制该进程可以分配的内存量。

  2. 如果存在内存泄漏并且是相当可预测的,则通过 cron 按照计划正常重新启动有问题的进程。

无论如何,OOM killer 都不是你的朋友,它是一个不受控制的炮弹 :-/

相关内容