Як постійно встановити коригування вбивці OOM для демонів?


12

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

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


Цікаво, що є можливість цього підкоригувати. Я думаю, що немає нічого кращого, ніж ваш нескінченний цикл для виконання завдання. Вбивця OOM закопаний глибоко всередині ядра і має дуже незрозумілий алгоритм.
Нільс

Відповіді:


8

Кілька сучасних систем нагляду dæmon мають засоби для цього. (Дійсно, оскільки для роботи є інструмент для завантаження ланцюгів, можливо, всі вони мають засоби для цього.)

  • На початку: Використовуйте 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- protection - -500
    аргументи
    програми
    Як бонус, ви можете зробити його параметризуемим:
    oom-убивати-захищати - fromenv
    і встановити значення параметра в середовищі сервісу (вважається, що він зчитується з envdir, пов’язаного зі службою, тут маніпулюють суглобом набору інструментів nosh rcctl):
    rcctl набору ім'я_служби oomprotect -500

Подальше читання

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

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

Для читачів, які використовують Ubuntu 16.04+, це стало застарілим тепер, коли Upstart був замінений на systemd.
gertvdijk

4

Ви можете зламати його в самому MySQL (наприклад, це sshdробить OpenSSH ), але це занадто жорстко і дуже брудно (проблеми з оновленнями тощо)

Це можна зробити в обгортці або в сценарії init - оцінка повинна бути успадкована (і в обгортці ви, мабуть, хочете це зробити exec mysqld "$@"все одно).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.