Включаем systemd-oomd в openSUSE

Как это работает

Убийство из-за нехватки памяти исторически происходило внутри пространства ядра. В системе linux с чрезмерным объемом памяти malloc (2) и его друзья обычно никогда не терпят неудачу. Однако, если приложение разыменовывает возвращенный указатель и системе не хватает физической памяти, ядро ​​Linux вынуждено принять крайние меры, вплоть до уничтожения процессов. Иногда это медленный и болезненный процесс, потому что ядро ​​может тратить неограниченное количество времени на замену страниц и удаление кеша страниц. Кроме того, настройка политики не очень гибкая, но при этом несколько сложная.

oomd стремится решить эту проблему в пользовательском пространстве. oomd использует PSI и cgroupv2 для целостного мониторинга системы. Затем oomd предпринимает корректирующие действия в пространстве пользователя до того, как OOM произойдет в пространстве ядра. Корректирующее действие настраивается через гибкую систему плагинов, в которую можно написать собственный код. По умолчанию это включает в себя уничтожение процессов-нарушителей. Это обеспечивает беспрецедентный уровень гибкости, когда каждая рабочая нагрузка может иметь собственные правила защиты. Кроме того, время, затрачиваемое на livelock в пространстве ядра, сведено к минимуму.

Теперь установка и активация демона

Важно отметить, в openSUSE запуск PSI по умолчанию отключен, глянем что у нас в конфиге ядра

1
zgrep PSI /proc/config.gz

В результате мы должны получить такие строчки

1
2
CONFIG_PSI=y
CONFIG_PSI_DEFAULT_DISABLED=y

Из них видно что сам PSI включен в ядре, но его запуск отключен.
Что бы это исправить, необходимо добавить 3 аргумента командной строки GRUB

1
psi=1 swapaccount=1 systemd.unified_cgroup_hierarchy=1

Можно добавить через YaST2 в меню Загрузчик или отредактировать файл /etc/default/grub в строке

1
GRUB_CMDLINE_LINUX_DEFAULT="... psi=1 swapaccount=1 systemd.unified_cgroup_hierarchy=1"

После сохранения выполнить

1
sudo mkinitrd && systemctl reboot

После добавления необходимо перезагрузить ПК для того что бы принять изменения.
Теперь можно проверить и убедиться что все заработало

1
sudo watch cat /proc/pressure/*

Ожидаемый результат

1
2
3
4
5
6
Every 2,0s: cat /proc/pressure/cpu /proc/pressure/io /proc/pressure/memory                                         
some avg10=0.00 avg60=0.00 avg300=0.00 total=1856816
some avg10=0.12 avg60=0.05 avg300=0.12 total=27159603
full avg10=0.12 avg60=0.05 avg300=0.11 total=26389041
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

Теперь установка демона ommd

Пакет есть в моем репозитории, у кого не подключен выполняем команды

1
sudo zypper ar -f obs://home:Dead_Mozay home:Dead_Mozay && sudo zypper ref

Установка пакета:

1
sudo zypper in oomd

Активация демона:

1
sudo systemctl enable --now oomd

Проверяем работу:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo systemctl status oomd
● oomd.service - Userland out-of-memory killer daemon
Loaded: loaded (/usr/lib/systemd/system/oomd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2021-05-20 09:38:37 +06; 31min ago
Main PID: 1030 (oomd)
Tasks: 3 (limit: 4915)
CPU: 2.252s
CGroup: /system.slice/oomd.service
└─1030 /usr/bin/oomd --interval 1 --config /etc/oomd/oomd.json

мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:50] DisableOnDrop=0
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:54] SilenceLogs=
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:58] DetectorGroup=free swap goes below 10 percent
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:63] Detector=swap_free
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:65] Args=
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:70] threshold_pct=10
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:79] Action=kill_by_swap_usage
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:81] Args=
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/config/ConfigTypes.cpp:86] cgroup=user.slice/user-*.slice/session-*.scope,user.slice/user-*.slice/user@*.service/*,system.slice/*
мая 20 09:38:37 ADMIN oomd[1030]: [../src/oomd/Oomd.cpp:377] Running oomd

Видим что демон запустился и работает.

Файл конфигурации находится по адресу /etc/oomd/oomd.json
если вдруг кто захочет изменить настройки.