Наблюдение за работой Nohang в мониторе ресурсов Gtop

Предотвращаем переполнение оперативной памяти (OOM) в Linux

Я уверен, что каждый пользователь в своей жизни хоть раз сталкивался с явлением переполнения оперативной памяти или OOM (Out Of Memory). Все помнят как это происходит: система встаёт раком колом, ядро начинает грузить свопом жёсткий диск на 100%, хорошо если можно хоть курсором двигать, хотя это уже делу не поможет. В этом случае помогает только перезагрузка. А ведь мы же только Libre Office с Chromium на 2 ГБ ОЗУ запустили! Не понятно, почему ядро Linux так плохо справляется с переполнением оперативки, но с этим явлением можно успешно бороться своими силами и при минимуме накладных затрат.

В борьбе с явлением OOM нам поможет Nohang — демон для GNU/Linux, предотвращающий наступление явления переполнения оперативной памяти устройства путём принудительного завершения «прожорливого» процесса.

Принцип работы

Nohang в виде демона постоянно находится в оперативной памяти устройства (потребляет ~10 Мб ОЗУ) и следит за свободным количеством оперативной памяти и своп-раздела. Как только наступает условие явной нехватки ОЗУ и свопа (эти параметры указываются в конфигурационном файле приложения) Nohang принудительно завершает «жирное» приложение, вызвавшее нехватку оперативной памяти устройства.

В качестве примера — скриншот окна монитора ресурсов KDE, на котором отображена работа демона Nohang.

Наглядная демонстрация работы Nohang по предотвращению переполнения ОЗУ
Наглядная демонстрация работы Nohang по предотвращению переполнения ОЗУ

На среднем графике видны факты наступления состояния OOM (переполнения памяти) ОЗУ компьютера, на котором производился эксперимент. Оперативная память накачивалась бесполезными пустыми данными с помощью команды:

tail /dev/zero

Осторожно! Выполнение данной команды может привести (и без установленных утилит вроде Nohang — 100% приведёт) к переполнению оперативной памяти устройства и его зависанию, сколько бы ОЗУ в нём не было установлено!

Как видно, после первой попытки своп заполнился на 100% (в качестве свопа использовался раздел zRam) так же, как и ОЗУ, после чего Nohang прибивает процесс tail и оперативная память снова освобождается, возвращаясь к значению свободного места, которое имела до начала эксперимента. Интересно то, что своп остаётся заполненным практически на 100%, но при следующих попытках исчерпать всю доступную ОЗУ это не приводит к зависанию всей системы, и Nohang снова завершает прожорливый процесс tail, освобождаю ОЗУ. По субъективным ощущениям для пользователя, происходит кратковременное подтормаживание системы на пару секунд, после чего контроль над системой возвращается без каких-либо проблем. В общем — сказка!

Установка Nohang в различных дистрибутивах Linux

Так как не все, как я, используют в своей работе Arch Linux, рассмотрим процесс установки Nohang для всех самых популярных дистрибутивов.

Arch Linux, Manjaro Linux

pacaur -S nohang-git
sudo systemctl enable --now nohang

Debian GNU/Linux, Ubuntu, Linux Mint

Устанавливаем из Github:

git clone https://github.com/hakavlad/nohang.git
cd nohang
sudo make install-desktop
sudo make systemd

Если уведомления на рабочем столе не нужны, заменяем «sudo make install-desktop» на «sudo make install«

Fedora, RHEL, openSUSE

sudo dnf copr enable atim/nohang
sudo dnf install nohang
sudo systemctl enable --now nohang

Настройка

Все параметры Nohang настраиваются в конфигурационном файле

/etc/nohang/nohang.conf

В принципе, всё можно оставить как есть, параметры по-умолчанию там оптимальны для любой конфигурации железа.

Включение оповещений на рабочем столе

Чтобы включить всплывающие оповещения о нехватке ОЗУ и завершении приложений Nohang, нужно в файле конфигурации изменить следующие параметры на значение «True» чтобы получилось вот так:

post_action_gui_notifications = True
low_memory_warnings_enabled = True

После чего сохранить изменения в конфигурационном файле и перезапустить Nohang для применения новой конфигурации:

sudo systemctl restart nohang.service

Проверка

Проверяем состояние демона Nohang:

sudo systemctl status nohang.service

Статус работы должен быть указан зелёным цветом:

Active: active (running)

Если так — Nohang запущен и работает нормально, можно приступать к экспериментам.

Сохраняем все несохранённые данные во всех приложениях, делаем резервные копии важных данных!

Это я на всякий случай 😏 Что ж, инициируем процесс накачки оперативной памяти пустыми данными:

tail /dev/zero

И смотрим что из этого получится 😀 По идее, вы можете почувтвовать непродолжительный дискомфорт, проявляющийся в зависании системы на несколько секунд, после чего Nohang должен отработать по tail и управление системы вернётся в ваши руки. А точнее, скорее всего так и произойдёт, что можно будет считать успешным достижением поставленной цели.

Так же можно установить более легковесный менеджер OOM — Earlyoom.