Время от времени мой сервер убивает named. Это регистрируется:
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
Похоже, у меня заканчивается память, но почему всегда называется убитый процесс, а не какой-то другой процесс? Есть ли способ предотвратить это?
Я использую CentOS 6.2 на Linode VPS.
В 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 как авторитетный или рекурсивный (что позволит вам ограничить использование его кэш-памяти)?
На самом деле в дереве процессов есть файл, который позволяет вам отключать или изменять поведение 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
работает только один процесс.
Надеюсь это поможет!