3. Базовое ускорение системы#

Переходя к базовой оптимизации системы мне сто́ит напомнить, что чистый Arch Linux - это фундамент, и требуется уйма надстроек для нормальной работы системы. Установить компоненты, которые будут отвечать за электропитание, чистку, оптимизацию и тому подобные вещи, что и описывается в данном разделе.

3.1. Настройка makepkg.conf#

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

Для этого создадим пользовательский конфиг ~/.makepkg.conf в домашней директории, чтобы переопределить системные настройки:

nano ~/.makepkg.conf#
CFLAGS="-march=native -mtune=native -O2 -pipe -fno-plt -fexceptions \
      -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \
      -fstack-clash-protection -fcf-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
RUSTFLAGS="-C opt-level=3 -C target-cpu=native -C link-arg=-z -C link-arg=pack-relative-relocs"
MAKEFLAGS="-j$(nproc) -l$(nproc)"

Примечание

Где "-O2" - Это не нуль/ноль

Данные флаги компилятора выжимают максимум производительности при компиляции, но могут вызывать ошибки сборки в очень редких приложениях. Если такое случится, то отключите параметр ‘lto’ в строке options добавив перед ним символ восклицательного знака ! ("!lto").

3.1.1. Использование tmpfs для сборки в ОЗУ#

Во время сборки программ компилируются множество временных промежуточных файлов и записываются на диск (HDD/SSD) для последующей компоновки в исполняемый файл или библиотеку. Для ускорения процесса сборки пакетов можно использовать вместо HDD/SSD - оперативную память, а точнее tmpfs. Поскольку ОЗУ значительно быстрее любого HDD или SSD, то сборка происходит быстрее. Помимо этого уменьшается нагрузка на систему ввода-вывода, и как следствие меньше изнашивается диск. Использовать tmpfs для makepkg можно несколькими способами:

  • Непосредственно указывать переменную перед сборкой:

    BUILDDIR=/tmp/makepkg makepkg -sric
    
  • Для сборки всего - задать параметр (раскомментировать в файле /etc/makepkg.conf) BUILDDIR для использования директории /tmp:

    BUILDDIR=/tmp/makepkg
    
  • Создать отдельную директорию tmpfs заданного размера:

    • Необходимо добавить в /etc/fstab директорию для монтирования tmpfs, указав путь и максимальный объём директории, которая может расширяться при работе tmpfs (учтите что tmpfs использует ОЗУ, поэтому внимательно подходите к вопросу выделяемого объема, он не должен превышать общий объем доступной памяти, несмотря на то, что изначально tmpfs ничего не занимает), например:

      tmpfs   /var/tmp/makepkg         tmpfs   rw,nodev,nosuid,size=16G          0  0
      
    • Далее, как и в предыдущем случае, указать BUILDDIR в /etc/makepkg.conf, но уже с путем к директории указанной в fstab:

      BUILDDIR=/var/tmp/makepkg
      

Внимание

На системах с небольшим количеством ОЗУ (например 4 ГБ и менее) tmpfs может негативно сказаться на сборке тяжёлых пакетов, что может привести к недостатку ОЗУ для сборки.

Примечание

Можно указать параметр PKGDEST для определения директории собранного пакета.

Количество доступного и используемого места в tmpfs можно посмотреть:

df -h

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

df -h | grep tmpfs

3.1.2. Включение ccache#

В Linux системах есть не так много программ, сборка которых может занять больше двух часов, но они все таки есть. Потому, было бы неплохо ускорить повторную компиляцию таких программ как Wine/Proton-GE и т.д.

ccache - это кэш для компиляторов C/C++, в частности совместимый с компиляторами GCC/Clang, цель которого состоит в ускорении повторного процесса компиляции одного и того же кода. Это значит, что если при сборке программы новой версии, будут замечены полностью идентичные блоки исходного кода в сравнении с его старой версией, то компиляция этих исходных текстов производиться не будет. Вместо этого, уже готовый, скомпилированный код старой версии будет вынут из кэша ccache. За счёт этого и достигается многократное ускорение процесса компиляции.

Установка

sudo pacman -S ccache

После установки его ещё нужно активировать в ваших настройках makepkg. Для этого отредактируем конфигурационный файл

nano ~/.makepkg.conf#
BUILDENV=(!distcc color ccache check !sign)

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

Внимание

ccache может ломать сборку некоторых программ, поэтому будьте осторожны с его применением.

3.2. Установка полезных служб и демонов#

3.2.1. zram-generator#

zram-generator — демон для создания блочных устройств ZRAM. ZRAM - это альтернативный механизм подкачки в ядре Linux, который позволяет избавиться от обычной подкачки на диске и сжимать неиспользуемые данные прямо внутри памяти ресурсами CPU. Больше подробностей о том, как именно работает подкачка и в частности ZRAM вы можете в разделе Тюнинг ядра. Установка zram-generator выполняется всего парой команд:

sudo pacman -S zram-generator
sudo systemctl start systemd-zram-setup@zram0.service

Имеет смысл выполнить также небольшую дополнительную настройку параметров ZRAM:

sudo nano /etc/systemd/zram-generator.conf#
[zram0]
zram-size = ram
compression-algorithm = zstd
swap-priority = 100
fs-type = swap

Здесь мы указываем размер ZRAM равным количеству оперативной памяти, а также алгоритм сжатия zstd. Это позволит экономить больше памяти, так как по заверениям разработчиков, эффективность сжатия в среднем равна 1:3, что позволяет хранить внутри ZRAM объем данных больший, чем вы в принципе можете уместить в ОЗУ.

Предупреждение

Во избежание конфликтов, после установки zram обязательно отключите zswap через добавление параметра ядра zswap.enabled=0.

Примечание

Как уже было сказано ранее, сжатие страниц в памяти осуществляется ресурсами CPU, но если он у вас достаточно слабый, то вы можете оказаться чувствительными к задержкам на распаковку/сжатие большого объема страниц. В этом случае имеет смысл либо вернуться к использованию обычного свопа, либо использовать менее ресурсоемкий алгоритм сжатия (compression-algorithm) как lzo.

3.2.2. systemd-oomd#

OOM киллером называют специальный демон, который предотвращает возникновение так называемых OOM (Out-Of-Memory) ситуаций. Если по простому, то он просто убивает самый "жирный" процесс в группе процессов (cgroup) прежде, чем он забьет всю память и ваш компьютер зависнет. В ядре Linux уже есть встроенный OOM киллер, но он отличается медленной скоростью реакции, поэтому лучше использовать OOM киллер в пространстве пользователя. Система инициализации systemd предлагает встроенный OOM киллер - systemd-oomd, который отличается малым потреблением ресурсом в фоне и не создает нагрузки на процессор, которая свойственна другим OOM киллерам из-за отслеживания потребления памяти процессов без использования механизма PSI, предлагаемым ядром Linux. Поэтому именно его и рекомендуется использовать. Включить его можно при помощи данной команды:

sudo systemctl enable --now systemd-oomd

3.2.3. Ananicy CPP#

Ananicy CPP — это форк одноименного демона, распределяющий приоритет задач. Его установка очень сильно повышает отклик системы. В отличии от оригинального Ananicy, данный форк переписан полностью на C++, из-за чего достигается прирост в скорости работы.

git clone https://aur.archlinux.org/ananicy-cpp.git # Скачивание исходников.
cd ananicy-cpp                                      # Переход в ananicy-cpp.
makepkg -sric                                       # Сборка и установка.
sudo systemctl enable --now ananicy-cpp             # Включаем службу.

# Далее описывается установка дополнительных правил по перераспределению приоритетов процессов
git clone https://aur.archlinux.org/cachyos-ananicy-rules-git.git
cd cachyos-ananicy-rules-git
makepkg -sric
sudo systemctl restart ananicy-cpp

3.2.4. TRIM#

TRIM - это встроенная команда контроллера для очищения уже неиспользуемых ячеек на твердотельном накопителе. Её очень полезно периодически выполнять с целью профилактики SSD. Чтобы это происходило автоматически раз в неделю рекомендуется включить уже готовую службу:

sudo systemctl enable fstrim.timer

Если по каким-то причинам вы не используете systemd или вам нужно выполнить TRIM прямо сейчас воспользуйтесь одноименной командой fstrim:

sudo fstrim -v /

Предупреждение

Если вы используйте файловую систему Btrfs и имеете версию ядра 6.2 и выше, то выполнять включение службы для осуществления периодическего выполнения команды TRIM - не нужно, т. к. Btrfs сам выполняет её в асинхронном режиме.

3.2.5. Автоматическая очистка кэша pacman#

Кэш пакетов pacman имеет плохое свойство забиваться и со временем занимает много места на диске. Чтобы этого не происходило, создадим небольшой демон, который будет автоматически его очищать, например, каждую неделю. В этом нам могут встроенные средства systemd для создания таймеров - специальных служб, которые устанавливают периодичность выполнения того или иного события, например, запуска другой службы (в нашем случае службы очистки кэша). Напишем таймер, выполняющий команду pacman -Scc регулярно раз в неделю с периодом проверки времени один раз в час. Для этого сначала создадим службу, которая будет регулярно выполняться, назовем её pacman-cleaner.service:

/etc/systemd/system/pacman-cleaner.service#
[Unit]
Description=Cleans pacman cache

[Service]
Type=oneshot
ExecStart=/usr/bin/pacman -Scc --noconfirm

[Install]
WantedBy=multi-user.target

И для этой службы создадим соответствующий таймер, который будет активировать её выполенение каждую неделю:

/etc/systemd/system/pacman-cleaner.timer#
[Unit]
Description=Run clean of pacman cache every week

[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

Не забываем включить этот самый таймер:

sudo systemctl enable --now pacman-cleaner.timer

3.2.6. irqbalance#

irqbalance - это демон, что автоматически балансирует обработку прерываний по ядрам процессора.

sudo pacman -S irqbalance
sudo systemctl enable --now irqbalance

3.3. Низкие задержки звука (PipeWire)#

PipeWire - это новая альтернатива PulseAudio, которая призвана избавить от проблем PulseAudio, уменьшить задержки звука и потребление памяти.

sudo pacman -S pipewire pipewire-pulse pipewire-jack lib32-pipewire gst-plugin-pipewire wireplumber
systemctl --user enable --now pipewire pipewire.socket pipewire-pulse wireplumber

Примечание

Пакет lib32-pipewire нужен для правильной работы звука в 32-битных играх (в том числе запускаемых через Wine) или приложениях.

Примечание

PipeWire и WirePlumber поставляются по умолчанию в Arch Linux для новых установок: https://gitlab.archlinux.org/archlinux/packaging/packages/pipewire/-/commit/14614b08f6f8cf8e50b4cbb78a141e82066e7f80

Для непосредственно уменьшения самих задержек установим дополнительный пакет realtime-privileges и добавим пользователя в группу realtime:

sudo pacman -S realtime-privileges rtkit
sudo usermod -aG realtime "$USER"

Дополнительно советуем установить реализацию Jack API. См. раздел ниже.

3.3.1. Настройка PipeWire#

Несмотря на то, что настройки по умолчанию могут работать достаточно хорошо для большинства оборудования, имеет смысл выполнить дополнительную настройку для улучшения качества звука (особенно если вы являетесь обладателем ЦАП или полноценной звуковой карты).

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

mkdir -p ~/.config/pipewire/pipewire.conf.d

В появившейся директории создадим файл со следующим содержанием:

nano ~/.config/pipewire/pipewire.conf.d/10-sound.conf#
 context.properties = {
   default.clock.rate = 48000
   default.clock.allowed-rates = [ 44100 48000 88200 96000 ]
   default.clock.min-quantum = 16
 }

Обратите внимание на параметры default.clock.rate и default.clock.allowed-rates. Они устанавливают частоту дискретизации по умолчанию и доступные частоты в целом соответственно. Вы должны указать их в соответствии с возможностями вашего устройства вывода звука (звуковой карты/ЦАПа). Чтобы узнать максимально доступную частоту дискретизации используйте команду (при условии, что установлен пакет pipewire-pulse):

pactl list sinks | grep "Sample Specification" -B 2

Если устройств несколько, то устанавливайте частоту того, которое используется непосредственно для вывода звука.

Для устройств с большим диапозоном доступных частот в качестве примера можно привести следующие значения:

default.clock.rate          = 192000
default.clock.allowed-rates = [ 44100 48000 88200 96000 176400 192000 352800 384000 768000 ]

3.3.1.1. Микширование стерео в 5.1#

PipeWire так же как и PulseAuido позволяет микшировать звук в 5.1. Эта возможность отключена по умолчанию, но для неё существует заранее подготовленный конфигурационный файл, который нам нужно просто перенести в домашнюю директорию:

mkdir -p ~/.config/pipewire/pipewire-pulse.conf.d
cp /usr/share/pipewire/client-rt.conf.avail/20-upmix.conf ~/.config/pipewire/pipewire-pulse.conf.d
cp /usr/share/pipewire/client-rt.conf.avail/20-upmix.conf ~/.config/pipewire/client-rt.conf.d

3.3.1.2. Исправление хрипов под нагрузкой#

Некоторые пользователи после перехода на PipeWire могут столкнуться с появлением "хрипов" во время произведения звука если система находится под высокой нагрузкой (например фоновой компиляцией или во время игры). Это происходит потому, что PipeWire старается осуществлять вывод с звука с наименьшими задержками, что сложно гарантировать когда система нагружена даже с установленными realtime-privileges.

Для их исправления отредактируем файл, который мы создали выше и изменим следующие значения для размера буфера по умолчанию:

nano ~/.config/pipewire/pipewire.conf.d/10-sound.conf#
 context.properties = {
   default.clock.rate = 96000
   default.clock.allowed-rates = [ 44100 48000 88200 96000 ]
   default.clock.min-quantum = 16
   default.clock.quantum = 4096
   default.clock.max-quantum = 8192
 }

Здесь вы должны изменить только значение параметра quantum до 4096. Остальные значения как default.clock.rate и default.clock.allowed-rates вы должны указывать с учетом вашего оборудования как уже говорилось выше.

3.3.2. Реализации JACK#

Существует три различных реализации JACK API: просто jack из AUR, jack2 и pipewire-jack. Наглядное сравнение их возможностей показано таблицей ниже:

../_images/jack-implementations.png

Установите один из вышеуказанных пакетов. Для поддержки 32-битных приложений также установите пакет lib32-jack из AUR, lib32-jack2 или lib32-pipewire-jack (соответственно) из репозитория multilib.

Для официальных примеров клиентов и инструментов JACK установите jack-example-tools.

Для альтернативной поддержки ALSA MIDI в jack2 установите a2jmidid..

Для поддержки dbus с jack2 установите jack2-dbus (рекомендуется).

3.3.3. Простая ALSA#

ALSA - это тот самый звук (условно, на самом деле это звуковая подсистема ядра), который идёт напрямую из ядра и является самым быстрым, так как не вынужден проходить множество программных прослоек и микширование.

sudo pacman -S alsa-lib alsa-utils alsa-firmware alsa-card-profiles alsa-plugins

Поэтому, если у вас нет потребности в микшировании каналов, записи аудио через микрофон и вы не слушаете музыку через Bluetooth, то ALSA может вам подойти.Пакет alsa-utils также содержит консольный Микшер (настройка громкости), который вызывается командой alsamixer.

3.4. Ускорение загрузки системы#

3.4.1. Отключение NetworkManager-wait-online#

В большинстве случаев для настройки интернет подключения вы, скорее всего, будете использовать NetworkManager, т.к. он является в этом деле швейцарским ножом и поставляется по умолчанию во многих средах рабочего стола. Однако, если вы пропишите команду systemd-analyze blame, то узнаете, что он задерживает загрузку системы в среднем на ~4 секунды. Очевидно, это совсем не то, что нам хотелось бы видеть от службы для управления интернет подключением. Так как данная служба всего лишь занимается ожиданием установки соединения, то мы можем просто отключить её (замаскировать). Чтобы это сделать выполните команду:

sudo systemctl mask NetworkManager-wait-online.service

3.4.2. Ускорение распаковки initramfs#

Как уже было сказано, initramfs - это начальное загрузочное окружение, которое идет в дополнение к образу ядра Linux и должно содержать в себе все необходимые ядру модули и утилиты для его правильной загрузки (прежде всего необходимые для монтирования корневого раздела). Для экономии места на загрузочном разделе данное окружение поставляется в виде саморасжимаемого архива, который распаковывается на лету во время загрузки системы. В Arch Linux программа для генерации initramfs - mkinitcpio, по умолчанию сжимает их при помощи алгоритма zstd, который имеет оптимальные показатели скорости сжатия и расжатия. При этом понятно, что скорость сжатия initramfs не так важна, как скорость расжатия - ведь она напрямую влияет на скорость загрузки системы. Поэтому для ускорения данного процесса лучше всего использовать алгоритм с самой быстрой скоростью расжатия - lz4.

Чтобы использовать lz4 в качестве основного алгоритма сжатия для initramfs нам следует отредактировать конфигурационный файл /etc/mkinitcpio.conf и добавить в него следующие строчки:

/etc/mkinitcpio.conf#
 COMPRESSION="lz4"
 COMPRESSION_OPTIONS="-9"

Не забываем обновить все образы initramfs после проделанных изменений:

sudo mkinitcpio -P

3.4.3. Ускорение загрузки системы c помощью systemd#

Есть ещё способ ускорить загрузку системы, используя систему инициализации systemd, указав её использование на самом раннем этапе загрузки ядра внутри initramfs окружения. Для этого нужно убрать base и udev из массива HOOKS в файле /etc/mkinitcpio.conf, и заменить их на systemd чтобы он выглядел примерно так:

sudo nano /etc/mkinitcpio.conf#
 HOOKS=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck)

Предупреждение

Для систем с зашифрованным корневым разделом к представленному перечню хуков вам также следует добавить sd-encrypt через пробел сразу после хука sd-vconsole.

Это немного увеличит образ initramfs, но заметно может ускорить запуск системы на пару секунд.

Не забываем обновить все образы initramfs после проделанных изменений:

sudo mkinitcpio -P

3.5. Твики драйверов Mesa#

3.5.1. Форсирование использования AMD SAM (Только для опытных пользователей).#

AMD Smart Acess Memory (или Resizble Bar) — это технология которая позволяет процессору получить доступ сразу ко всей видеопамяти GPU, а не по блокам в 256 мегабайт, что приводит к задержкам ввода/вывода при обмене между CPU и GPU. Несмотря на то, что данная технология заявлена только для оборудования AMD и требует новейших комплектующих для обеспечения своей работы, получить её работу можно и на гораздо более старом оборудовании, например таком как AIT Radeon HD 7700.

Предупреждение

Для включения данной технологии в настройках вашего BIOS (UEFI) должна быть включена опция "Re-Size BAR Support" и "Above 4G Decoding". Если таких параметров в вашем BIOS (UEFI) нет - скорее всего технология не поддерживается вашей материнской платой и не стоит даже пытаться её включить.

К сожалению, после недавнего обновления драйверов Mesa, поддержка SAM была удалена из драйвера OpenGL - radeonsi, но вы по прежнему можете заставить Mesa использовать SAM при работе в приложениях использующих Vulkan.

Чтобы активировать SAM в Linux нужно добавить переменные окружения:

sudo nano /etc/environment#
RADV_PERFTEST=sam # Только для Vulkan

Предупреждение

Учтите, что в некоторых играх с vkd3d вам может понадобиться также экспортировать переменную VKD3D_CONFIG=no_upload_hvv для избежания регрессий производительности при использовании вместе с SAM.

https://www.reddit.com/r/linux_gaming/comments/119hwmt/this_setting_may_help_vkd3d_games_that_have/

3.5.2. Решение проблем работы графики Vega 11 (Спасибо @Vochatrak-az-ezm)#

На оборудовании со встроенным видеоядром Vega 11 может встретиться баг драйвера, при котором возникают случайные зависания графики. Проблема наиболее актуальна для Ryzen 2XXXG и чуть реже встречается на Ryzen серии 3XXXG, но потенциально имеет место быть и на более новых видеоядрах Vega.

Решается через добавление следующих параметров ядра:

sudo nano /etc/modprobe.d/90-amdgpu.conf#
options amdgpu gttsize=8192 lockup_timeout=1000 gpu_recovery=1 noretry=0 ppfeaturemask=0xfffd3fff deep_color=1

На всякий случай можно дописать ещё одну переменную окружения:

sudo nano /etc/enviroment#
AMD_DEBUG=nodcc

Для подробностей можете ознакомиться со следующими темами:

https://www.linux.org.ru/forum/linux-hardware/16312119

https://www.linux.org.ru/forum/desktop/16257286

3.5.3. Многопоточная OpenGL обработка#

У Mesa есть свой аналог переменной окружения __GL_THREADED_OPTIMIZATIONS=1, так же предназначенный для активирования многопоточной обработки OpenGL - mesa_glthread=true. В ряде игр и приложений это даёт сильное увеличение производительности, но в некоторых либо нет прироста, либо вовсе не может быть применено.

Чтобы включить его для всей системы нужно либо прописать переменную окружения в файл /etc/environment, либо используя adriconf, включив параметр во вкладке "Performance" -> "Enable offloading GL driver work to a separate thread"