Как это работает
Убийство из-за нехватки памяти исторически происходило внутри пространства ядра. В системе linux с чрезмерным объемом памяти malloc (2) и его друзья обычно никогда не терпят неудачу. Однако, если приложение разыменовывает возвращенный указатель и системе не хватает физической памяти, ядро Linux вынуждено принять крайние меры, вплоть до уничтожения процессов. Иногда это медленный и болезненный процесс, потому что ядро может тратить неограниченное количество времени на замену страниц и удаление кеша страниц. Кроме того, настройка политики не очень гибкая, но при этом несколько сложная.
oomd стремится решить эту проблему в пользовательском пространстве. oomd использует PSI и cgroupv2 для целостного мониторинга системы. Затем oomd предпринимает корректирующие действия в пространстве пользователя до того, как OOM произойдет в пространстве ядра. Корректирующее действие настраивается через гибкую систему плагинов, в которую можно написать собственный код. По умолчанию это включает в себя уничтожение процессов-нарушителей. Это обеспечивает беспрецедентный уровень гибкости, когда каждая рабочая нагрузка может иметь собственные правила защиты. Кроме того, время, затрачиваемое на livelock в пространстве ядра, сведено к минимуму.
Теперь установка и активация демона
Важно отметить, в openSUSE запуск PSI по умолчанию отключен, глянем что у нас в конфиге ядра
1 | zgrep PSI /proc/config.gz |
В результате мы должны получить такие строчки
1 | CONFIG_PSI=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 | Every 2,0s: cat /proc/pressure/cpu /proc/pressure/io /proc/pressure/memory |
Теперь установка демона 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 | sudo systemctl status oomd |
Видим что демон запустился и работает.
Файл конфигурации находится по адресу /etc/oomd/oomd.json
если вдруг кто захочет изменить настройки.