Nohang config file Комментариями являются строки, начинающиеся с решёток, пробелов и табуляций. Инлайновые комментарии запрещены. Пробелы допустимы внутри строк в любом количестве. Все параметры, кроме строковых (display, notify_options, *list_regex), проходят проверку на допустимые значения. ##################################################################### I. STANDARD OUTPUT VERBOSITY Печатать параметров конфига при запуске программы. Допустимые значения: True и False print_config = True Печатать ли результаты измерения доступной памяти. Допустимые значения: True и False print_mem_check_results = True Печатать ли время сна между проверками памяти и после отправки сигналов. Можно установить в значение True для дебага. Допустимые значения: True и False print_sleep_periods = False ##################################################################### II. SELF-DEFENSE True - заблокировать процесс в памяти для запрета его своппинга. False - не блокировать. Значения чувствительны к регистру! В Fedora 28 значение True вызывает увеличение потребления памяти процессом на 200 MiB, в Debian 8 и 9 такой проблемы нет. mlockall = False Установка отрицательных значений self_nice и self_oom_score_adj требует наличия root прав. Установка отрицательного self_nice повышает приоритет процесса. Допустимые значения - целые числа из диапазона [-20; 19] self_nice = -15 Задать oom_score_adj для процесса. Установка значения -1000 запретит самоубийство. Допустимые значения - целые числа из диапазона [-1000; 1000] self_oom_score_adj = -100 ##################################################################### III. MONITORING INTENSITY Коэффициенты, влияющие на интенсивность мониторинга. Допустимыми значениями являются положительные числа. Уменьшение коэффициентов способно снизить нагрузку на прцессор и увеличить периоды между проверками памяти. Почему три коэффициента, а не один? - Потому что скорость наполнения свопа обычно ниже скорости наполнения RAM. Можно для свопа задать более низкую интенсивность мониторинга без ущерба для предотвращения нехватки памяти и тем самым снизить нагрузку на процессор. В дефолтных настройках на данной интенсивности демон работает достаточно хорошо, успешно справляясь с резкими скачками потребления памяти. rate_mem = 6 rate_swap = 3 rate_zram = 1 ##################################################################### IV. THRESHOLDS FOR SENDING SIGNALS Задание уровней доступной памяти, ниже которых происходит отправка сигналов SIGTERM или SIGKILL. Сигнал отправляется если MemAvailable и SwapFree одновременно опустятся ниже соответствующих значений. Значения могут быть выражены в процентах (%) и мебибайтах (M) Диапазон допустимых значений - от 0 до 100 %. mem_min_sigterm = 10 % mem_min_sigkill = 6 % swap_min_sigterm = 10 % swap_min_sigkill = 6 % Задание общей доли zram в памяти, при превышении которой происходит отправка соответствующих сигналов. Экспериментально удалось добиться доли зрам в 95%, при которой система виснет или запускается OOM killer. По мере увеличения доли zram в памяти может падать отзывчивость системы. Может также задаваться в % и M. Диапазон допустимых значений - от 0 до 100% (90% - это обычно уровень зависания или срабатывания OOM killer'a) zram_max_sigterm = 55 % zram_max_sigkill = 60 % ##################################################################### V. PREVENTION OF KILLING INNOCENT VICTIMS Минимальное значение oom_score, которым должен обладать процесс для того, чтобы ему был отправлен сигнал. Позволяет предотвратить убийство невиновных если что-то пойдет не так. Значение должно быть целым числом из диапазона [0; 1000] Может min_badness с учетом списков? oom_score_min = 20 Минимальная задержка после отправки соответствующих сигналов для предотвращения риска убийства сразу множества процессов. Должно быть неотрицательным числом. min_delay_after_sigterm = 0.5 min_delay_after_sigkill = 3 Процессы браузера chromium обычно имеют oom_score_adj 200 или 300. Это приводит к тому, что процессы хрома умирают первыми вместо действительно тяжелых процессов. Если параметр decrease_oom_score_adj установлен в значение True, то у процессов, имеющих oom_score_adj выше oom_score_adj_max значение oom_score_adj будет опущено до oom_score_adj_max перед поиском жертвы. False - не изменять oom_score_adj процессов перед поиском жертвы. Значения чувствительны к регистру! Требует root прав. decrease_oom_score_adj = True Допустимые значения - целые числа из диапазона [0; 1000] oom_score_adj_max = 20 ##################################################################### VI. DESKTOP NOTIFICATIONS Эта возможность требует наличия notify-send в системе. В Debian/Ubuntu это обеспечивается установкой пакета libnotify-bin. В Fedora и Arch Linux - пакет libnotify. Также требуется наличие сервера уведомлений. При запуске nohang от рута уведомления рассылаются всем залогиненным пользователям. See also wiki.archlinux.org/index.php/Desktop_notifications Допустимые значения: True и False desktop_notifications = True Дополнительные опции для notify-send. См. notify-send --help и man notify-send Примеры: notify_options = -u "critical" notify_options = -t "20000" -i "dialog-warning" notify_options = Переменая окружения $DISPLAY, передаваемая notify-send при запуске nohang с uid = 0. Должен совпадать с выводом $ echo $DISPLAY root_display = :0 ##################################################################### VII. BLACK, WHITE, AVOID AND PREFER LISTS Можно задать регулярные выражения (Perl-compatible regular expressions), которые будут использоваться для сопоставления с именами процессов для влияния на их badness. Включение этой опции замедляет поиск жертвы, так как имена всех процессов сравниваются с заданными regex-паттернами. use_regex_lists = False Приоритет списков (если один процесс находится одновременно в нескольких): 1. whitelist_regex: сначала пропуск процессов из белого списка; 2. blacklist_regex: отправка сигнала всем из черного списка; 3. preferlist_regex и avoidlist_regex: умножение или деление oom_score на соответствующие факторы. Процессы, имена которых соответствуют выражению whitelist_regex, не получат сигнал. Регулярное выражение для формирования белого списка. whitelist_regex = Xorg|sshd При нехватке памяти все процессы, имена которых соответствуют blacklist_regex, получат сигнал. blacklist_regex = Badness процессов, имена которых соответствуют preferlist_regex, будут рассчитываться по формуле badness = (oom_score + 1) * preferlist_factor preferlist_regex = tail|python3 Диапазон допустимых значений: [1; 1000] preferlist_factor = 3 Список нежелательных для убийства процессов. Badness процессов, имена которых соответствуют avoidlist_regex, будут рассчитываться по формуле badness = oom_score / avoidlist_factor avoidlist_regex = Диапазон допустимых значений: [1; 1000] avoidlist_factor = 3 ##################################################################### VIII. LOGGING В лог записывается дата, объемы доступной памяти и ход предотвращения OOM. Valid values are True and False. logging = True logfile = /var/log/nohang/nohang.log ##################################################################### IX. LOW MEMORY WARNINGS Десктопные уведомления о низком уровне доступной памяти. Для работы опции должны быть включены десктопные уведомления. Возможно стоит этот раздел объединить с DESKTOP NOTIFICATIONS. Valid values are True and False. low_memory_warnings = True Минимальное время между отправками уведомлений в секундах. Должно быть в диапазоне [1; 300]. min_time_between_warnings = 20 Уровни MemAvailable и SwapFree одновременно будут ниже соотвестствующих значений, то будут отправлены уведомления. Могут быть выражены в процентах (%) и мебибайтах (M). mem_min_warnings = 20 % swap_min_warnings = 20% Если доля zram в памяти превысит значение zram_max_warnings, то будут отправляться уведомления с минимальным периодом min_time_between_warnings. zram_max_warnings = 40 % ##################################################################### X. EXECUTE THE COMMAND INSTEAD OF SENDING THE SIGTERM SIGNAL Для процессов с определенным именем можно задать команду, которая будет выполняться вместо отправки сигнала SIGTERM процессу с соответствующим именем. Например, если процесс запущен как демон, то вместо отправки SIGTERM можно выполнить команду перезапуска. Допустимые значения: True и False. execute_the_command = False Длина имени процесса не должна превышать 15 символов. Синтаксис таков: строки, начинающиеся с **, считаются строками, содержащими имена процессов и соотвестствующие команды для перезапуска этих процессов. После имени процесса через двойное двоеточие (::) следует команда. Например: ** mysqld :: systemctl restart mariadb.service & ** php-fpm7.0 :: systemctl restart php7.0-fpm.service & Амперсанд (&) в конце команды позволит nohang продолжить работу не дожидаясь окончания выполнения команды. ** processname :: some command &