我们有一个 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