在 Linux 中逃离 OOM 杀手的死亡

Wax*_*ead 6 memory linux process oom

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

OOM 杀手的问题就像任何其他杀手一样。表面上看起来很理智很​​理性,但其实内心很不安,很疯狂,常常无法做出正确的判断。

现在我个人不介意杀戮,只要我知道发生了什么并且对受害者有一定的控制权(冷静的人,我在谈论计算机的东西)所以我正在寻找更好的方法来保护针对可怕的 OOM 杀手的某些进程,这样我就不必在每次我的所有程序运行时或每当我启动一个新程序时都运行脚本。关于如何轻松实现这一目标的任何想法?

hai*_*img 6

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

由于OOM Killer运行的严格限制(不能分配更多内存,不能交换其他进程等),它杀死你不想被杀死的进程以缓解内存压力。

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

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

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

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

无论如何,OOM 杀手不是你的朋友,它是一个松散的大炮:-/