RuCore.NET

EarlyOOM: предотвращаем ситуацию OOM в Linux быстро и просто





Если вы работаете с «тяжелыми» приложениями в условиях нехватки оперативной памяти, вам знакома такая ситуация, как OOM — Out Of Memory, это когда запущенным программам нужно больше оперативной памяти, чем имеется в системе. В такой ситуации система обычно начинает свапиться на диск и при этом тормозить, что неприятно для пользователя.

Механизм OOM Killer призван спасать системы на базе Linux от нехватки памяти. Работает он достаточно просто: когда память заканчивается он на основе специального алгоритма вычисляет процесс, смерть которого причинит меньше всего вреда и даст больше всего сободной памяти и убивает его.



Этот механизм имеет спорную репутацию среди пользователей: с одной стороны ему практически нет альтернатив, с другой — он начинает работу в тот момент когда система уже давно и глубоко заторможена «сидением в подкачке». В качестве альтернативы OOM Killer разрабатывается Early OOM Daemon, о котором и пойдёт речь далее.

Установка и настройка

На базе Red Hat (Fedora, Red Hat Linux Enterprise)

sudo dnf install earlyoom

sudo systemctl enable —now earlyoom

На базе Arch Linux (Manjaro, Arch)

sudo pacman -S earlyoom

sudo systemctl enable —now earlyoom

 

Для дистрибутива Ubuntu и ему подобных:

В Ubuntu 18.04 Early OOM Daemon присутсвует в стандартном репозитории и его можно установить командой:

apt-get install earlyoom

Early OOM Daemon не имеет файла настроек и желаемые опции ему надо передавать в виде параметров командой строки. Описать их можно в файле «/etc/default/earlyoom». В этом файле есть некоторое количество примеров, достаточных для базовой настройки. Кроме того достаточно информативна man-страница сервиса. Прежде чем написать свою конфигурацию рассмотрим основные параметры:

  • -m: количество свободной памяти в процентах, при котором необходимо начинать чистку.
  • -s: количество свободной «подкачки» в процентах при котором необходимо начинать чистку.
  • -M: аналогично -m, но размер в кибибайтах (KiB, 1 KiB = 1024 bytes).
  • -S: аналогично -s, но размер в кибибайтах (KiB).
  • —prefer: регулярное выражение, описывающее процессы, которые стоит убивать в первую очередь.
  • —avoid: регулярное выражение, описывающее процессы, которые стоит убивать в последнуюю очередь.
  • -N: команда, используемая для отправки нотификаций в случае срабатывания сервиса.

Здесь есть интересный момент: параметр -N расчитан на работу совместно с утилитой notify-send из пакета «libnotify-bin» и запускает команду примерно так:

COMMAND -l dialog-warning earlyoom "Killing process 10977 Web Content"

И отсюда начинаются проблемы: так как сам сервис работает от пользователя root и не имеет доступа к пользовательской сессии то необходимо придумать какой-то обходной манёвр. Автор этих строк тестировал earlyroom на дистрибутиве Lubuntu 18.04, работая под учётной записью с именем «moose» и в итоге был написал скрипт «/home/moose/scripts/earlyoom-notify.sh» следующего содержания:

#!/bin/bash

if [ "$#" -ne "4" ]; then
        echo "Illegal params number"
        exit
fi

RUNASUSER="moose"

WHOAMI=`whoami`
if [ ${WHOAMI} != ${RUNASUSER} ]; then
        su -c "$0 \"$1\" \"$2\" \"$3\" \"$4\"" ${RUNASUSER}
        exit
fi

DISPLAY=:0 notify-send "$1" "$2" "$3" "$4"

Этот скрипт по сути является обёрткой для notify-send и просто запускает notify-send в нужном окружении.

В файле «/etc/default/earlyoom» конфигурация была описана следующим образом:

EARLYOOM_ARGS="-m 5 -s 60 --prefer '(^|/)(firefox|thunderbird)$' --avoid '(^|/)(sshd|systemd|init)' -N /home/moose/scripts/earlyoom-notify.sh"

Разумеется после изменения этих настроек необходимо перезапустить сервис командой:

service earlyoom restart

В описаной конфигурации чистка памяти запускается когда остаётся менее 5% свободной оперативной памяти и менее 60% места на разделе подкачки. Первыми целями являются браузер и почтовый клиент, а последними — системные сервисы. При закрытии приложения будет показано сообщение в углу экрана.

 

Проверка работы

Узнать статус процесса Earlyoom можно с помощью следующей команды:

sudo systemctl status earlyoom.service

Если в статусе указано «Active: active (running)» — всё в порядке, Earlyoom запущен и правильно работает. Теперь можно устроить в системе катастрофическую нехватку оперативной памяти для проверки работы Earlyoom. Для этого прежде всего отключим swap на диске, если таковой имеется, чтобы не ждать пока он заполнится.

sudo swapoff -a

Ну а теперь забиваем всю доступную в системе оперативную память нулями:

tail /dev/zero

Далее должно произойте следующее: процесс tail должен занять всю доступную ОЗУ в системе, после чего его должен прибить Earlyoom, тем самым освободив оперативную память. Если у вас произошло именно так — поздравляю, всё работает как и должно! Успехов!

Источник: https://www.ylsoftware.com/ и https://imatvey.xyz/ 



Поделись статьей с друзьями


15 просмотров



Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: