Как навсегда установить настройки убийцы OOM для демонов?

12

Запуская некоторые серверы Linux с одним или несколькими жизненно важными демонами системной службы, я бы хотел настроить OOM killer для этих демонизированных процессов на случай, если произойдет что-то странное. Например, сегодня некоторые сервера Ubuntu работает MySQL получил убил MySQL демон , потому что тонны apt-checkerпроцессов были потребить всю память и ядро думали , что это была идея хорошая , чтобы убить MySQL.

Я знаю, что могу настроить счет, используя /proc/$(pidof mysqld)/oom_score_adjфайл, чтобы дать ядру некоторую подсказку, я не предпочитаю, чтобы MySQL был убит, но это не переживает перезапуск службы. Должен ли я отредактировать сценарии init / upstart из пакета, чтобы включить эти настройки? Я не думаю, что это очень элегантное решение, так как я бы внес изменения в файлы, принадлежащие пакету. Можно ли вообще подключиться к сценариям upstart / init и условно настроить их? Или вы бы предложили запустить неопределенный скрипт, как while true{ adjust_oom(); sleep 60;}?

gertvdijk
источник
Интересно, что есть возможность настроить это. Я думаю, что нет ничего лучше, чем ваш бесконечный цикл для выполнения этой работы. OOM-killer скрыт глубоко в ядре и имеет очень непонятный алгоритм.
Нильс

Ответы:

8

Несколько современных систем надзора за демонами имеют для этого средства. (Действительно, поскольку для этой работы существует инструмент загрузки цепей, возможно, у всех есть средства для этого.)

  • Upstart: использовать oom scoreв файле задания.
    OOM Оценка -500
  • systemd: используйте OOMScoreAdjust=настройку в сервисном блоке. Вы можете использовать файлы исправлений сервисных модулей, чтобы повлиять на предварительно упакованные сервисные модули.
    [Сервис] 
    OOMScoreAdjust = -500
  • Семейство daemontools : используйтеoom-kill-protectинструмент из набора инструментов nosh вrunпрограмме для сервиса.

    Если вы конвертируете системный сервисный модуль, convert-systemd-unitsинструмент фактически преобразует OOMScoreAdjust=настройку в такой вызов oom-kill-protect.

    #! / bin / nosh 

    oom-kill-protect - -500

    программные аргументы
    В качестве бонуса вы можете сделать его параметризуемым:
    oom-kill-protect - fromenv
    и установите значение параметра в среде сервиса (предполагается, что он читается из envdir, связанного с сервисом, здесь манипулируется с помощью набора инструментов rcctlnosh):
    rcctl набора имя_служба oomprotect -500

дальнейшее чтение

  • Джонатан де Бойн Поллард (2016). oom-kill-protect, Нош инструментарий. Softwares.
  • Джеймс Хант и Клинт Байрум (2014). " oom score" Выскочка поваренной книги .
  • Леннарт Поэттеринг (2013-10-07). " OOMScoreAdjust" systemd.exec, Системные справочные страницы. freedesktop.org.
  • Джонатан де Бойн Поллард. rcctl, Нош инструментарий. Softwares.
  • /unix//a/409454/5132
JdeBP
источник
9

Это возможно в Ubuntu с помощью Upstart и oom scoreопции конфигурации.

oom score

У Linux есть средство убийства «нехватки памяти». [...]

Обычно убийца OOM рассматривает все процессы одинаково, этот раздел советует ядру относиться к этой работе по-разному.

Значение «корректировки», предоставленное этому разделу, может быть целочисленным значением от -999 (очень маловероятно, что он будет убит убийцей OOM) до 1000 (очень вероятно, что он будет убит убийцей OOM). [...]

Пример:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app
gertvdijk
источник
Для читателей, использующих Ubuntu 16.04+, это стало устаревшим теперь, когда Upstart был заменен systemd.
gertvdijk
4

Вы можете взломать его в самом MySQL (например, это sshdделает OpenSSH ), но это слишком хардкорно и очень грязно (проблемы с обновлениями и т. Д.)

Вы можете сделать это в оболочке или в скрипте инициализации - оценка должна быть унаследована (и в оболочке вы, вероятно, захотите сделать в exec mysqld "$@"любом случае).

Использование cgroups- это даст вам немного больше гибкости и может стать постоянным в том смысле, что соответствующие настройки могут автоматически применяться при перезапуске службы. См., Например, управление приоритетом приложений, использующих cgroups для получения дополнительной информации. Для достижения необходимого вам автоматического подхода вы, возможно, захотите взглянуть на libcgroup , которая содержит демон, который может обрабатывать изменения cgroups запущенного процесса на лету в соответствии с набором правил, или просто использовать cgexecоболочку ( из той же упаковки).

peterph
источник