被杀

被杀

每隔一段时间,我的服务器就会终止命名。记录如下:

Apr 16 17:00:08 li127-203 kernel: Out of memory: Kill process 15723 (named) score 38 or sacrifice child
Apr 16 17:00:08 li127-203 kernel: Killed process 15723 (named) total-vm:92096kB, anon-rss:5492kB, filers:0kB

看起来我的内存快用完了,但为什么总是named进程被终止,而不是其他进程呢?有什么方法可以防止这种情况发生吗?

我在 Linode VPS 上运行 CentOS 6.2。

答案1

OOM 杀手是个反复无常的情妇。BIND 之所以成为目标,是因为根据 OOM 杀手的逻辑,它被认为是最佳目标。链接页面上的代码注释对此进行了很好的解释,但值得粘贴:

/*
 * oom_badness - calculate a numeric value for how bad this task has been
 * @p: task struct of which task we should calculate
 * @p: current uptime in seconds
 *
 * The formula used is relatively simple and documented inline in the
 * function. The main rationale is that we want to select a good task
 * to kill when we run out of memory.
 *
 * Good in this context means that:
 * 1) we lose the minimum amount of work done
 * 2) we recover a large amount of memory
 * 3) we don't kill anything innocent of eating tons of memory
 * 4) we want to kill the minimum amount of processes (one)
 * 5) we try to kill the process the user expects us to kill, this
 *    algorithm has been meticulously tuned to meet the principle
 *    of least surprise ... (be careful when you change it)
 */

但这只能告诉你为什么它以 BIND 为目标。解决方案可能不是“让它以其他目标为目标”,因为其他消耗大量内存的东西可能也很重要。解决方案更可能是“不要触发 OOM 杀手”。

您能否增加此系统可用的内存或交换空间,或减少其他进程使用的内存?此系统上还运行着什么?BIND 是否配置为权威性或递归性(这将允许您限制其缓存内存使用量)?

答案2

实际上,进程树中有一个文件可让您禁用或更改 OOM 行为,位于/proc/PROCESS_ID/oom_adj文档)。要禁用,您可以执行以下操作:

echo 17 > /proc/PROCESS_ID/oom_adj

因此,如果您想始终将其应用于named,则可以使用:

echo 17 > /proc/$(pidof named)/oom_adj

但请记住,这$(pidof named)可能会返回比运行 pid 多的信息,尽管我思考 named仅一个进程正在运行。

希望这可以帮助!

相关内容