每隔一段时间,我的服务器就会终止命名。记录如下:
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
仅一个进程正在运行。
希望这可以帮助!