The No Hang Daemon ================== `Nohang` is a highly flexible full-featured daemon for Linux that correctly prevents out of memory. ### Features - Переиодическая проверка доступной памяти - задача - препятствовать зависанию системы при нехватке доступной памяти, а также корректное завершение процессов с целью увеличения объема доступной памяти - периодически проверяет объем доступной памяти, при дефиците памяти отправляет `SIGKILL` или `SIGTERM` процессу с наибольшим `oom_score` - поддержка работы со `zram`, возможность реакции на `mem_used_total` - удобный конфиг с возможностью тонкой настройки - возможность раздельного задания уровней `MemAvailable`, `SwapFree`, `mem_used_total` для отпраки `SIGTERM` и `SIGKILL`, возможность задания в процентах и мебибайтах. - возможность снижения `oom_score_adj` процессов, чьи `oom_score_adj` завышены (актуально для `chromium`) - лучший алгоритм выбора периодов между проверками доступной памяти: при больших объемах доступной памяти нет смысла проверять ее состояние часто, поэтому период проверки уменьшается по мере уменьшения размера доступной памяти - интенсивность мониторинга можно гибко настраивать (параметры конфига `rate_mem`, `rate_swap`, `rate_zram`) - возможность блокировки памяти с помощью `mlockall()` для предотвращения своппинга процесса - по умолчанию высокий приоритет процесса `nice -15`, может регулироваться через конфиг - предотвращение самоубийства с помощью `self_oom_score_adj = -1000` - возможность задания `oom_score_min` для предотвращения убийства невиновных - возможность предотвращения избыточного убийства процессов с помощью задания миниального `oom_score` для убиваемых процессов и установка минимальной задержки просле отправки сигналов (параметры конфига `min_delay_after_sigkill` и `min_delay_after_sigterm`) - возможность показа десктопных уведомлений c помощью `notify-send`, с показом сигнала (`SIGTERM` или `SIGKILL`), который отправлен процессу, а также `Pid`, `oom_score`, `VmRSS`, `VmSwap`, которыми обладал процесс перед получением сигнала. - поддержка white, black, prefer и avoid списков с использованием Perl-compatible regular expressions - возможность выполнения определенных команд как альтернатива отправке SIGTERM для избранных процессов (можно использовать для перезапуска демонов вместо завершения) - поддержка десктопных уведомлений о низком уровне доступной памяти - наличие установщика для пользователей `systemd` - протестировано на `Debian 9 x86_64`, `Debian 8 i386`, `Fedora 28 x86_64` - пример вывода с отчетом об успешной отпраке сигнала: ``` 2018-06-30 Sat 19:42:56 MemAvailable (0 MiB, 0.0 %) < mem_min_sigterm (470 MiB, 8.0 %) SwapFree (457 MiB, 7.8 %) < swap_min_sigterm (470 MiB, 8.0 %) Preventing OOM: trying to send the SIGTERM signal to tail, Pid: 14884, Badness: 866, VmRSS: 5181 MiB, VmSwap: 4983 MiB Success ``` ### Requirements - Linux 3.14+ - Python 3.4+ ### Memory and CPU usage - VmRSS 9.5 - 12.9 MiB - Нагркзка на CPU зависит от объема доступной памяти и растет по мере уменьшения объема доступной памяти ### Download, install, purge ```bash git clone https://github.com/hakavlad/nohang.git cd nohang ``` Установка ```bash sudo ./install.sh ``` Удаление вместе с конфигом ```bash sudo ./purge.sh ``` Удалить всё, кроме конфига ```bash sudo ./uninstall.sh ``` ### Settings `Nohang` настраивается с помощью [конфига](https://github.com/hakavlad/nohang/blob/master/nohang.conf), расположенного после установки по адресу ``` /etc/nohang/nohang.conf ``` К опциям прилагается описание. Отредактируйте значения параметров в соответствии с вашими предпочтениями и перезапустите сервис командой `sudo systemctl restart nohang`. ### Почему Python, а не C? - Скорость разработки на Python значительно выше. Больше фич за приемлемое время. - Практически единственный минус Python - большее потребление памяти процессом. - На самом деле я просто не знаю C и немножко изучал Python, поэтому пишу на последнем. ### Hint Можно использовать `nohang` для мониторинга размера используемой `zram` памяти (традиционные утилиты для проверки объема доступной памяти, такие как `free`, `top`, `htop`, `gnome-system-monitor` не предоставляют информации об объеме памяти, занимаемом устройствами `zram`) ### Known bugs В рабочем алгоритме известных нет, если найдете - пишите в [Issues](https://github.com/hakavlad/nohang/issues).