防止 Linux 的 OOM 杀死我们 Web 服务器上的 Apache

防止 Linux 的 OOM 杀死我们 Web 服务器上的 Apache

我们有一个 debian linux 网络服务器。它只运行 apache2。我们的 mysql 服务器在另一台主机上。但是我们有时会在网络服务器上运行 cron 任务来执行常规任务。

然而最近,其中一个 cron 任务出现了错误,开始占用大量内存。Linux OOM 杀手杀死了 Apache。这当然导致我们的网站瘫痪。内存消耗大的 cron 仍在运行。然而在这种情况下,我希望 OOM 杀手杀死该脚本,然后不是阿帕奇。

有没有办法配置内核,以便我可以说终止名为“apache2”的进程(或者至少让 apache2 成为最后的它会杀死什么? apache 和常规 cron 都以同一用户 (www-user) 运行。

答案1

听起来你并没有通过实际调试为什么这个 cron 作业占用了这么多内存来解决问题的根本原因。

您可以尝试设置此选项

echo 1 > /proc/sys/vm/oom_kill_allocating_task

这将告诉 OOM 终止程序终止触发 OOM 条件的进程,但这不一定是您的 cron 作业。您还可以在脚本中使用“ulimit -m”来设置要使用的最大常驻内存量。我认为最好的办法是评估 cronjob 占用如此多内存的原因,以及它是否最适合另一台主机或需要重写以消耗更少的内存。

答案2

OOMKiller 工具可在一定程度上配置。启动进程后,您可以将的值设置/proc/<pid>/oom_adj为负整数。这将影响 OOMKiller 对该进程及其子进程的亲和力。当您的系统遇到内存不足的情况时,其他进程将被终止。

答案3

您还可以更改虚拟内存过度使用行为。例如,您可以将 /proc/sys/vm/overcommit_memory 的值更改为“2”——表示不要过度使用内存。(不要在不了解其作用的情况下更改此值。)

在“无过度使用”模式下,无论新进程请求更多 RAM,在尝试分配时都会收到错误。因此,不是让 OOM 杀手去摧毁旧的、长期运行的进程,而是让请求 RAM 的新进程被告知“不”。

...然后你需要修复内存问题。找到泄漏点,重新设计消耗内存的进程,给机器添加更多内存,等等。

答案4

这里说您可以在进程上设置 OOM_DISABLE“标志”: http://linux-mm.org/OOM_Killer

相关内容