На Linux-системах с небольшим объемом физической оперативной памяти (например, на VPS-ках) часто можно заметить, что какой-либо процесс внезапно прекращает работу. В чем же дело? Оказывается, он «убит», а виновник — злобный OOM Killer !
OOM Killer представляет собой компонент ядра Linux, защитный механизм, призванный решать проблемы с нехваткой физической памяти (OOM — Out of memory). При обнаружении недостатка памяти OOM Killer «убивает» наименее важный по его мнению процесс, посылая ему сигнал KILL (исключения составляют лишь init и ядерные нити (kernel threads)). Сообщение о об этом появляется в журнале /var/log/syslog в виде:
Out of memory: Kill process **** (****) score **** or sacrifice child
Killed process **** (****)
Но мнение пользователя системы не всегда совпадает с мнением «киллера» 🙂 Как же быть? Как заставить OOM Killer не трогать дорогие нашему сердцу процессы?
На моей VPS-ке жертвой OOM Killer часто становится FTP-сервер ProFTPD. Прекратим это хулиганство! 🙂
Сначала выясним идентификатор (PID) процесса FTP-сервера — proftpd:
Идентификатор оказывается равным 3234.
Затем настроим OOM Killer так, чтобы он даже и не думал убить процесс с PID 3234 — записывает в файл oom_adj в соответствуюшем каталоге (/proc/PID/oom_adj)
магическое число -17 (OOM score):
Проверим заданные настройки:
-17 — всё в порядке! Voi la! Теперь мой FTP-сервер вечно живой 🙂
Спасибо, учтём на будущее.
Однако, проблема-то не в киллере, а в том, что «кто-то слишком много ест».
Киллер — это доктор. Добрый доктор с окровавленной пилой, который приходит отрезать ногу, чтобы остальной пациент выжил.
Насколько я понимаю, очки, по которым доктор-киллер выбирает убиваемого зависят не в последнюю осчередь от объёма занятой процессом памяти. Соотвтественно, если неуязвимый сервер будет жрать её бочками — киллер может убить что-нибудь критически важное для системы и Вы потеряете управление.
На моей VPS киллер обычно убивает мои боты или сервисы 🙂 но, к счастью, весьма редко. Убить, например, Apache ему на ум пока не приходило, но это не исключено, конечно. Но, в любом случае, даже если он умудрится потушить доступ по SSH, я могу перезагрузить систему из панели управления VPS-провайдера.