我们有一个 debian linux 网络服务器。它只是运行apache2。我们的 mysql 服务器在另一台主机上。然而,我们有时会在网络服务器上运行 cron 任务来执行常规任务。
然而最近其中一个 cron 任务有一个错误并开始吞噬内存。Linux OOM 杀手杀死了 apache。当然,这让我们的网站崩溃了。内存不足的 cron 继续运行。但是在这种情况下,我希望 OOM 杀手杀死该脚本,而不是apache。
有什么方法可以配置内核,这样我就可以说不要杀死名为“apache2”的进程(或者至少让 apache2 成为它最后杀死的东西)?apache 和常规 crons 都以相同的用户(www-user)运行。
听起来您并没有通过实际调试此 cron 作业占用如此多内存的原因来解决问题的根本原因。
您可以尝试设置此选项
回声 1 > /proc/sys/vm/oom_kill_allocating_task
这将告诉 OOM 杀手杀死触发 OOM 条件的进程,但这不能保证是您的 cron 作业。您还可以在脚本中使用“ulimit -m”来设置要使用的最大常驻内存量。我认为你最好的选择是评估为什么 cronjob 会占用这么多内存,以及它是否最适合另一台主机或被重写以消耗更少的内存。
OOMKiller在一定程度上是可配置的。启动进程后,您可以将 的值设置
/proc/<pid>/oom_adj
为负整数。这将影响 OOMKiller 对进程及其子进程的亲和力。当您的系统遇到内存不足的情况时,其他进程将被终止。您还可以更改虚拟内存过度提交行为。例如,您可以将 /proc/sys/vm/overcommit_memory 的值更改为“2”——这意味着不要过度使用内存。(不要在不了解它的作用的情况下更改此值。)
在“无过度使用”模式下,无论新进程要求更多内存,当它尝试分配时都会收到错误消息。因此,与其让 OOM 杀手去破坏你的旧的、长期运行的进程,不如让新人要求 RAM 被告知“不”。
...然后你需要解决你的内存问题。找到漏洞,重新设计消耗内存的进程,向盒子添加更多的 ram,等等。
简短的回答:不,OOM-killer 是不可配置的,并且存在/一直抵制改变它。
我脑子里只有几个想法:
增加交换空间——如果脚本是 32 位的,那么应该很容易给它们太多空间以耗尽它们。
增加物理内存。1 差不多。
用于
ulimit
限制脚本可以占用的内存量。它在这里说您可以在进程上设置 OOM_DISABLE “标志”:http: //linux-mm.org/OOM_Killer