support logging to separate file and support low memory warnings
This commit is contained in:
parent
8825021f6b
commit
e5fb5db7bd
20
README.md
20
README.md
@ -31,6 +31,9 @@ https://www.linux.org.ru/forum/talks/12684213?lastmod=1466676523241#comment-1268
|
||||
"И IRL ты никогда не знаешь, в какой момент момент твои данные перестанут умещаться в оперативку. Потому zram -- удел embedded систем, где это может быть детерминировано."
|
||||
https://2ch.hk/s/res/2310304.html#2311483, https://archive.li/idixk
|
||||
|
||||
"OOM killer, зараза такая, не срабатывает или срабатывает через 3 часа."
|
||||
https://www.linux.org.ru/forum/desktop/11255705
|
||||
|
||||
`Nohang` позволяет избавиться от перечисленных выше проблем, корректно завершая наиболее прожорливые процессы (с наибольшим oom_score) сигналом `SIGTERM` (или `SIGKILL`) не дожидаясь когда система "встанет колом". `Nohang` позволяет не бояться зависаний при использовании `zram`.
|
||||
|
||||
### Зачем нужен nohang, если уже есть earlyoom?
|
||||
@ -59,18 +62,21 @@ https://2ch.hk/s/res/2310304.html#2311483, https://archive.li/idixk
|
||||
- возможность показа десктопных уведомлений c помощью `notify-send`, с показом сигнала (`SIGTERM` или `SIGKILL`), который отправлен процессу, а также `Pid`, `oom_score`, `VmRSS`, `VmSwap`, которыми обладал процесс перед получением сигнала.
|
||||
- поддержка white, black, prefer и avoid списков с использованием Perl-compatible regular expressions
|
||||
- наличие `man` страницы
|
||||
- поддержка журналирования в отдельный файл
|
||||
- поддержка десктопных уведомлений о низком уровне доступной памяти
|
||||
- наличие установщика для пользователей `systemd`
|
||||
- протестировано на `Debian 9 x86_64`, `Debian 8 i386`, `Fedora 28 x86_64`
|
||||
- пример вывода с отчетом об успешной отпраке сигнала:
|
||||
```
|
||||
MemAvail: 0 M, 0.0 % | SwapFree: 97 M, 8.3 % | MemUsedZram: 147 M, 2.5 %
|
||||
MemAvail: 0 M, 0.0 % | SwapFree: 80 M, 6.8 % | MemUsedZram: 147 M, 2.5 %
|
||||
+ MemAvail (0 M, 0.0 %) < mem_min_sigterm (470 M, 8.0 %)
|
||||
SwapFree (80 M, 6.8 %) < swap_min_sigterm (94 M, 8.0 %)
|
||||
Try to send signal 15 to tail, Pid 17907, oom_score 837
|
||||
2018-07-02 Mon 16:51:20
|
||||
MemAvailable (0 MiB, 0.0 %) < mem_min_sigterm (470 MiB, 8.0 %)
|
||||
SwapFree (646 MiB, 5.5 %) < swap_min_sigterm (940 MiB, 8.0 %)
|
||||
Xorg (Pid: 11722) matches with whitelist_regex
|
||||
python3 (Pid: 26844, Badness 3) matches with preferlist_regex
|
||||
tail (Pid: 26845, Badness 2700) matches with preferlist_regex
|
||||
Preventing OOM: trying to send the SIGTERM signal to tail,
|
||||
Pid: 26845, Badness: 2700, VmRSS: 5033 MiB, VmSwap: 10797 MiB
|
||||
Success
|
||||
MemAvail: 640 M, 10.9 % | SwapFree: 730 M, 62.1 % | MemUsedZram: 141 M, 2.4 %
|
||||
MemAvail: 5197 M, 88.5 % | SwapFree: 734 M, 62.5 % | MemUsedZram: 141 M, 2.4 %
|
||||
```
|
||||
|
||||
### Установка и удаление для пользователей systemd
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/bin/bash -v
|
||||
#!/bin/sh -v
|
||||
|
||||
cp nohang /usr/local/bin/
|
||||
chmod 755 /usr/local/bin/nohang
|
||||
@ -15,6 +15,12 @@ cp nohang.1.gz /usr/local/share/man/man1/
|
||||
chmod 644 /usr/local/share/man/man1/nohang.1.gz
|
||||
rm nohang.1.gz
|
||||
|
||||
mkdir /var/log/nohang
|
||||
chmod 750 /var/log/nohang
|
||||
|
||||
cp nohang.logrotate /etc/logrotate.d/nohang
|
||||
chmod 644 /etc/logrotate.d/nohang
|
||||
|
||||
cp nohang.service /etc/systemd/system/
|
||||
chmod 644 /etc/systemd/system/nohang.service
|
||||
systemctl daemon-reload
|
||||
|
141
nohang.conf
141
nohang.conf
@ -2,12 +2,15 @@
|
||||
Nohang config file
|
||||
|
||||
Комментариями являются строки, начинающиеся с решёток, пробелов
|
||||
и табуляций. Инлайновые комментарии запрещены. Пробелы допустиы
|
||||
внутри строк в любом количестве.
|
||||
и табуляций. Инлайновые комментарии запрещены.
|
||||
Пробелы допустимы внутри строк в любом количестве.
|
||||
|
||||
Все параметры, кроме строковых (display, notify_options,
|
||||
*list_regex), проходят проверку на допустимые значения.
|
||||
|
||||
#####################################################################
|
||||
|
||||
I. VERBOSITY
|
||||
I. STANDARD OUTPUT VERBOSITY
|
||||
|
||||
Печатать параметров конфига при запуске программы.
|
||||
Допустимые значения: True и False
|
||||
@ -17,18 +20,17 @@ print_config = True
|
||||
Печатать ли результаты измерения доступной памяти.
|
||||
Допустимые значения: True и False
|
||||
|
||||
print_mem_check_results = True
|
||||
print_mem_check_results = False
|
||||
|
||||
Печатать ли время сна между проверками памяти и после отправки
|
||||
сигналов. Можно установить в значение True для дебага.
|
||||
Допустимые значения: True и False
|
||||
(В этой ветке по дефолту True)
|
||||
|
||||
print_sleep_periods = False
|
||||
|
||||
#####################################################################
|
||||
|
||||
II. SELF PROTECTION
|
||||
II. SELF-DEFENSE
|
||||
|
||||
True - заблокировать процесс в памяти для запрета его своппинга.
|
||||
False - не блокировать. Значения чувствительны к регистру!
|
||||
@ -36,7 +38,7 @@ print_sleep_periods = False
|
||||
В Fedora 28 значение True вызывает увеличение потребления
|
||||
памяти процессом на 200 MiB, в Debian 8 и 9 такой проблемы нет.
|
||||
|
||||
mlockall = False
|
||||
mlockall = True
|
||||
|
||||
Установка отрицательных значений self_nice и self_oom_score_adj
|
||||
требует наличия root прав.
|
||||
@ -54,7 +56,7 @@ self_oom_score_adj = -1000
|
||||
|
||||
#####################################################################
|
||||
|
||||
III. ИНТЕНСИВНОСТЬ МОНИТОРИНГА
|
||||
III. MONITORING INTENSITY
|
||||
|
||||
Коэффициенты, влияющие на интенсивность мониторинга.
|
||||
Допустимыми значениями являются положительные числа.
|
||||
@ -71,13 +73,13 @@ self_oom_score_adj = -1000
|
||||
достаточно хорошо, успешно справляясь с резкими скачками потребления
|
||||
памяти.
|
||||
|
||||
rate_mem = 6000000
|
||||
rate_swap = 3000000
|
||||
rate_zram = 1000000
|
||||
rate_mem = 6
|
||||
rate_swap = 3
|
||||
rate_zram = 1
|
||||
|
||||
#####################################################################
|
||||
|
||||
IV. ПОРОГИ ДЛЯ ОТПРАВКИ СИГНАЛОВ
|
||||
IV. THRESHOLDS FOR SENDING SIGNALS
|
||||
|
||||
Задание уровней доступной памяти, ниже которых происходит
|
||||
отправка сигналов SIGTERM или SIGKILL.
|
||||
@ -87,6 +89,8 @@ rate_zram = 1000000
|
||||
|
||||
Значения могут быть выражены в процентах (%) и мебибайтах (M)
|
||||
|
||||
Диапазон допустимых значений - от 0 до 100 %.
|
||||
|
||||
mem_min_sigterm = 8 %
|
||||
mem_min_sigkill = 4 %
|
||||
|
||||
@ -100,13 +104,15 @@ swap_min_sigkill = 4 %
|
||||
По мере увеличения доли zram в памяти может падать
|
||||
отзывчивость системы.
|
||||
Может также задаваться в % и M.
|
||||
Диапазон допустимых значений - от 0 до 100% (90% - это обычно
|
||||
уровень зависания или срабатывания OOM killer'a)
|
||||
|
||||
zram_max_sigterm = 55 %
|
||||
zram_max_sigkill = 60 %
|
||||
|
||||
#####################################################################
|
||||
|
||||
V. THE PREVENTION OF KILLING INNOCENT VICTIMS
|
||||
V. PREVENTION OF KILLING INNOCENT VICTIMS
|
||||
|
||||
Минимальное значение oom_score, которым должен обладать
|
||||
процесс для того, чтобы ему был отправлен сигнал.
|
||||
@ -115,9 +121,6 @@ zram_max_sigkill = 60 %
|
||||
|
||||
Значение должно быть целым числом из диапазона [0; 1000]
|
||||
|
||||
Процессы из black_list (см ниже) получат сигнал вне зависимости
|
||||
от значения их oom_score.
|
||||
|
||||
Может min_badness с учетом списков?
|
||||
|
||||
oom_score_min = 20
|
||||
@ -141,7 +144,7 @@ min_delay_after_sigkill = 3
|
||||
|
||||
Требует root прав.
|
||||
|
||||
decrease_oom_score_adj = False
|
||||
decrease_oom_score_adj = True
|
||||
|
||||
Допустимые значения - целые числа из диапазона [0; 1000]
|
||||
|
||||
@ -170,46 +173,108 @@ desktop_notifications = True
|
||||
|
||||
notify_options =
|
||||
|
||||
Переменая окружения $DISPLAY, передаваемая notify-send при
|
||||
запуске nohang с uid = 0.
|
||||
Должен совпадать с выводом
|
||||
$ echo $DISPLAY
|
||||
|
||||
display = :0
|
||||
root_display = :0
|
||||
|
||||
#####################################################################
|
||||
|
||||
VII. BLACK, WHITE, AVOID AND PREFER LISTS
|
||||
|
||||
Можно задать списки с помощью Perl-compatible regular expressions.
|
||||
Можно задать регулярные выражения (Perl-compatible regular
|
||||
expressions), которые будут использоваться для сопоставления с
|
||||
именами процессов для влияния на их badness.
|
||||
|
||||
Включение этой опции замедляет поиск жертвы, так как
|
||||
имена всех процессов сравниваются с regexp паттернами всех
|
||||
списков.
|
||||
имена всех процессов сравниваются с заданными regex-паттернами.
|
||||
|
||||
use_regexp_lists = False
|
||||
use_regex_lists = False
|
||||
|
||||
Процессы из белого списка не получат сигнал.
|
||||
Приоритет списков (если один процесс находится одновременно в
|
||||
нескольких):
|
||||
1. whitelist_regex: сначала пропуск процессов из белого списка;
|
||||
2. blacklist_regex: отправка сигнала всем из черного списка;
|
||||
3. preferlist_regex и avoidlist_regex: умножение или деление
|
||||
oom_score на соответствующие факторы.
|
||||
|
||||
white_list = ^(Xorg|sshd)$
|
||||
Процессы, имена которых соответствуют выражению
|
||||
whitelist_regex, не получат сигнал.
|
||||
|
||||
При нехватке памяти все процессы из черного списка получат сигнал.
|
||||
Регулярное выражение для формирования белого списка.
|
||||
|
||||
black_list = ^()$
|
||||
whitelist_regex = Xorg|sshd
|
||||
|
||||
Список предпочтительных для убийства процессов.
|
||||
Badness процессов из prefer_list будет умножено на
|
||||
prefer_factor перед выбором жертвы. На самом деле формула
|
||||
для нахождения badness такая:
|
||||
badness = (oom_score + 1) * prefer_factor
|
||||
При нехватке памяти все процессы, имена которых соответствуют
|
||||
blacklist_regex, получат сигнал.
|
||||
|
||||
prefer_factor и avoid_factor должны быть положительными числами.
|
||||
blacklist_regex =
|
||||
|
||||
prefer_list = ^()$
|
||||
prefer_factor = 2
|
||||
Badness процессов, имена которых соответствуют preferlist_regex,
|
||||
будут рассчитываться по формуле
|
||||
badness = (oom_score + 1) * preferlist_factor
|
||||
|
||||
preferlist_regex = tail|python3
|
||||
|
||||
Диапазон допустимых значений: [1; 1000]
|
||||
|
||||
preferlist_factor = 3
|
||||
|
||||
Список нежелательных для убийства процессов.
|
||||
Badness процессов из avoid_list будет поделено на
|
||||
avoid_factor перед выбором жертвы.
|
||||
|
||||
avoid_list = ^()$
|
||||
avoid_factor = 2
|
||||
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 %
|
||||
|
||||
|
9
nohang.logrotate
Normal file
9
nohang.logrotate
Normal file
@ -0,0 +1,9 @@
|
||||
/var/log/nohang/*.log {
|
||||
create 640 root adm
|
||||
missingok
|
||||
notifempty
|
||||
weekly
|
||||
rotate 5
|
||||
compress
|
||||
delaycompress
|
||||
}
|
@ -7,6 +7,8 @@ Documentation=man:nohang(1) https://github.com/hakavlad/nohang
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
StandardOutput=null
|
||||
StandardError=syslog
|
||||
ExecStart=/usr/local/bin/nohang
|
||||
|
||||
[Install]
|
||||
|
6
purge.sh
6
purge.sh
@ -1,7 +1,9 @@
|
||||
#!/bin/bash -v
|
||||
#!/bin/sh -v
|
||||
systemctl stop nohang
|
||||
systemctl disable nohang
|
||||
rm /usr/local/bin/nohang
|
||||
rm /usr/local/share/man/man1/nohang.1.gz
|
||||
rm /etc/systemd/system/nohang.service
|
||||
rm /etc/logrotate.d/nohang
|
||||
rm -r /etc/nohang
|
||||
rm /usr/local/bin/nohang
|
||||
rm -r /var/log/nohang
|
||||
|
10
uninstall.sh
10
uninstall.sh
@ -1,6 +1,8 @@
|
||||
#!/bin/bash -v
|
||||
#!/bin/sh -v
|
||||
systemctl stop nohang
|
||||
systemctl disable nohang
|
||||
rm -f /usr/local/share/man/man1/nohang.1.gz
|
||||
rm -f /etc/systemd/system/nohang.service
|
||||
rm -f /usr/local/bin/nohang
|
||||
rm /usr/local/bin/nohang
|
||||
rm /usr/local/share/man/man1/nohang.1.gz
|
||||
rm /etc/systemd/system/nohang.service
|
||||
rm /etc/logrotate.d/nohang
|
||||
rm -r /var/log/nohang
|
||||
|
Loading…
Reference in New Issue
Block a user