Включаем 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
если вдруг кто захочет изменить настройки.

Дробное масштабирование

Изначально доступно только 2 варианта, 100% и 200%
Для включения поддержки экспериментальной функции дробного масштабирования в GNOME необходимо выполнить в консоли или нажав сочетание alt+F2

1
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"

После перезагрузить ПК, в настройках GNOME в разделе Дисплеи в строке Масштаб должны появиться дополнительные пункты с дробным масштабированием.

Если отвалилось разрешение DNS имен

Что бы исправить это, необходимо отредактировать файл /etc/nsswitch.conf

1
sudoedit /etc/nsswitch.conf

Находим строки

1
2
3
passwd:        compat
group: compat
shadow: compat

И меняем значение compat на files nis

1
2
3
passwd:         files nis
group: files nis
shadow: files nis

Находим строку

1
hosts:         [NOTFOUND=return] files mdns_minimal dns wins

И меняем на

1
hosts:          files dns myhostname

Разрешение DNS имен должно заработать сразу же после сохранения файла, но на всякий случай можно перезагрузить свой ПК.

HiDPI в Linux

GNOME

Для включения поддержки HiDPI в GNOME достаточно выбрать коэффициент масштабирования в настройках GNOME

Для Qt5 приложений

Добавить переменную окружения, например если хотим добавить переменную глобально, отредактируем файл /etc/profile
и добавить в конец строку

1
2
QT_AUTO_SCREEN_SCALE_FACTOR=1
export QT_AUTO_SCREEN_SCALE_FACTOR

После перезагружаем свой ПК

KDE Plasma 5

Для KDE Plasma необходимо сделать гораздо больше настроек
Выставить масштабирование

Так же нужно выставить DPI для монитора

И величину курсора

Существует проблема с масштабированием Qt приложений на Xorg

1
https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/139

что бы это исправить нужно применить костыль в виде переменной окружения

1
2
3
4
5
QT_AUTO_SCREEN_SCALE_FACTOR="1"
export QT_AUTO_SCREEN_SCALE_FACTOR

PLASMA_USE_QT_SCALING=1
export PLASMA_USE_QT_SCALING

Oh my ZSH тюнинг

Устанавливаем саму оболчку и дополнительные компоненты которые нам могут понадобиться

1
sudo zypper in zsh git which

Клонируем репозиторий Oh My ZSH

1
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

или

1
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

Если сразу не согласились на смену облочки, меняем сами

1
chsh -s /usr/bin/zsh

Перезапускаем сессию пользователя

Устанавливаем плагины

  1. Для подсветки
1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
  1. Для автодополнения
1
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

  1. Алиасы для консольной утилиты exa

Устанавливаем саму утилиту

1
sudo zypper in exa

Сам плагин с алиасами

1
git clone https://github.com/DarrinTisdale/zsh-aliases-exa.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-aliases-exa

их так же нужно указать в конфиге zsh

1
vim .zshrc

Находим строку plugins и через пробел добавляем только что установленные плагины

1
plugins=(... zsh-autosuggestions zsh-syntax-highlighting zsh-aliases-exa)

Перезапускаем терминал.

Алиасы:

1
2
3
4
5
6
alias ls='exa'       							# ls
alias l='exa -lbF --git' # list, size, type, git
alias ll='exa -lbGF --git' # long list
alias llm='exa -lbGd --git --sort=modified' # long list, modified date sort
alias la='exa -lbhHigUmuSa --time-style=long-iso --git --color-scale' # all list
alias lx='exa -lbhHigUmuSa@ --time-style=long-iso --git --color-scale' # all + extended list

Более подробную информацию о плагине exa можно глянуть набрав в консоли

1
omz plugin info zsh-aliases-exa

Установка ROCm

ROCm - платформа с открытым исходным кодом для высокопроизводительных вычислений и сверхмасштабных вычислений на GPU.
Открытая реализация OpenCL

Создать файл репозитория

1
2
3
4
5
6
7
8
9
10
11
12
sudo tee /etc/zypp/repos.d/rocm.repo <<EOF
[rocm]
name=ROCm
enabled=1
autorefresh=1
gpgcheck=1
baseurl=https://repo.radeon.com/rocm/zyp/4.1/
gpgkey=https://repo.radeon.com/rocm/rocm.gpg.key
type=rpm-md
skip_if_unavailable=True
keeppackages=0
EOF

Теперь можно приступать к установке пакетов

ВАЖНО!!! для пользователей openSUSE Tumbleweed!!!

C недавних пор директория /usr/lib/ переехала в другое место /usr/libexec
dkms устанавливает скрипты уже в новую директорию, но пакеты собраны для leap где расположение скриптов осталось в старой директории
соотвественно при выполнении pre и post скриплетов из пакета необходимые скрипты не могут быть найдены, по этому я пересобрал пакет dkms
с нужными путями. Но тут есть одно большое НО, я не знаю отработают ли скриплеты из других dkms модулей если они есть у кого то в системе, по этому сначала проверьте
наличие установки других dkms модулей в системе, например у кого что может быть установлен WiFi модуль при помощи dkms. Если таковых нет, то можно продолжать установку.

1
sudo zypper ar -f obs://home:Dead_Mozay:dkms home:Dead_Mozay:dkms
1
sudo zypper dup --from home:Dead_Mozay:dkms --allow-vendor-change

если не установлен

1
sudo zypper install dkms

Запустим демон dkms

1
sudo systemctl enable --now dkms
1
sudo zypper install rocm-dkms rocm-opencl hip-base

на ошибку

1
2
3
Проблема: ничто не предоставляет libffi.so.7()(64bit), необходимый для openmp-extras-12.41.0.40100-sles152.26.x86_64
Решение 1: не устанавливать rocm-dkms-4.1.0.40100-sles152.26.x86_64
Решение 2: повредить openmp-extras-12.41.0.40100-sles152.26.x86_64, игнорируя некоторые из его зависимостей

отвечаем 2

Установка займет довольно продолжительное время, объем загружаемых пакетов 2 Гб.

Проверить модуль можно командой

1
sudo dkms status

Если видите

1
amdgpu, 4.1-26.el7: added

Значит все ОК
Далее нужно поправить шебанг у скрипта rocm_agent_enumerator
Выполняем в терминале

1
sudo sed -i 's/^#!.*/#!\/usr\/bin\/python3/' /opt/rocm-4.1.0/bin/rocm_agent_enumerator

Так же желательно указать корректный путь к библиотеке libamdocl64.so в файле amdocl64_40100.icd
Открываем любым удобным способом
Например:

1
sudoedit /etc/OpenCL/vendors/amdocl64_40100.icd

и указываем корректный путь

1
/opt/rocm-4.1.0/opencl/lib/libamdocl64.so

Еще нужно созать rocm профиль с переменными, создаем скрипт

1
sudo vim /etc/profile.d/rocm.sh

c таким содержимым

1
2
3
4
export PATH=$PATH:/opt/rocm-4.1.0/opencl/bin
export PATH=/opt/rocm-4.1.0/bin:$PATH \
ROCM_PATH=/opt/rocm-4.1.0 \
HIP_PATH=/opt/rocm-4.1.0/hip

Пеоезагружаем ПК.
Для проверки работоспособности можно использовать утилиту hashcat

1
sudo zypper install hashcat

Запускаем бенчмарк

1
hashcat -b

Если тест прошел успешно, значит все работает.

Или утилитой rocminfo
первой же строкой должна быть

1
ROCk module is loaded

Blender пока не работает с OpenCL

https://github.com/RadeonOpenCompute/ROCm/issues/1106

SPICE USB проброс без запроса привелегий

Необходимо отредактировать файл /usr/share/polkit-1/actions/org.spice-space.lowlevelusbaccess.policy

1
sudo vi /usr/share/polkit-1/actions/org.spice-spice.lowlevelusbaccess.policy

И заменить значения allow_any и allow_active с no на yes

1
2
3
<allow_any>yes</allowany>
<allow_inactive>no</allow_inactive>
<allow_active>yes</allow_active>

На всякий случай перезапуть libvirtd демон

1
sudo systemctl restart libvirtd

VNC server

Что бы отключить шифрование, необходимо выполнить

1
gsettings set org.gnome.Vino require-encryption false

И перезапустить vino

1
systemctl --user restart vino-server

Автозапуск

Создать файл

1
~/.config/autostart/vino-server.desktop

С содержимым

1
2
3
4
5
[Desktop Entry]
Type=Application
Name=Vino VNC server
Exec=/usr/lib/vino/vino-server
NoDisplay=true

Включение WebRender в Firefox

На странице

1
about:config

Находим параметр

1
gfx.webrender.all

Выставляем значение

1
true

Перезапускаем браузер
Проверяем включился или нет на странице

1
about:support

В поле Композитинг должно быть значение WebRender