4. Экстра оптимизации#

4.1. Перевод процессора из стандартного энергосбережения в режим производительности#

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

Закрепим режим максимальной производительности:

sudo pacman -S cpupower                       # Установит менеджер управления частотой процессора
sudo cpupower frequency-set -g performance    # Выставляет максимальную  производительность до перезагрузки системы.

sudo nano /etc/default/cpupower # Редактируем строчку ниже

../_images/extra-optimizations-1.png

governor=’performance’ # Высокая производительность всегда!

sudo systemctl enable cpupower # Включить как постоянную службу которая установит вечный perfomance mode.

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

Для новых версий GNOME может не требоваться в виду наличия встроенного аналога - power-profiles-daemon: https://packages.debian.org/sid/power-profiles-daemon. Не забудьте включить службу: sudo systemctl enable --now power-profiles-daemon

4.1.1. GUI для изменение частоты процессора#

../_images/extra-optimizations-2.png

Установка:

git clone https://aur.archlinux.org/cpupower-gui.git
cd cpupower-gui
makepkg -sric

4.1.2. Альтернатива - Auto-Cpufreq#

Установка:

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

Внимание

Может конфликтовать со встроенным менеджером питания в GNOME 41+. Убедитесь, что он у вас выключен:

sudo systemctl disable --now power-profiles-daemon.service

4.2. Отключение спящего режима и гибернации#

sudo pacman -S polkit # Установить для управления системными привилегиями.

sudo nano /etc/polkit-1/rules.d/10-disable-suspend.rules # Убираем спящий режим и гибернацию (из меню и вообще). Если такого файла нет, то создайте его. Файл должен выглядеть вот так:

polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.login1.suspend" ||
      action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
      action.id == "org.freedesktop.login1.hibernate" ||
      action.id == "org.freedesktop.login1.hibernate-multiple-sessions")
  {
      return polkit.Result.NO;
  }
});

4.3. Отключение дампов ядра (Только для опытных пользователей)#

Отредактируйте /etc/systemd/coredump.conf в разделе [Coredump] раскомментируйте Storage = external и замените его на Storage = none.

Затем выполните следующую команду:

sudo systemctl daemon-reload

Уже одно это действие отключает сохранение резервных копий, но они все еще находятся в памяти. Если вы хотите полностью отключить дампы ядра, то измените soft на #* hard core 0 в /etc/security/limits.conf.

4.4. Повышение лимитов#

Отредактируйте файлы:

sudo nano /etc/systemd/system.conf
sudo nano /etc/systemd/user.conf

Изменените значения DefaultLimitNOFILE= на 523288 (можно удвоить).

systemctl daemon-reload

Для Arch Linux необходимо так же прописать лимиты в /etc/security/limits.conf (в самый нижний столбец):

username hard nofile 524288

Вместо username нужно вписать ваше имя пользователя.

../_images/limits.jpg

Эти изменения необходимы для правильной работы технологи Esync и увеличения плавности системы, так как параметры по умолчанию могут быть слишком малы. Подробнее здесь.

4.5. Отключение файла подкачки#

Для лучшей игровой производительности следует использовать файловую систему Btrfs и не задействовать файл подкачки (вместо него стоит использовать выше упомянутый zramswap, конечно при условии что у вас не слишком слабый процессор и оперативной памяти больше чем 4 ГБ), а также без страха отключать фиксы уязвимостей, которые сильно урезают производительность процессора (о них написано в следующем разделе).

sudo swapoff /dev/sdxy  # Вместо xy ваше название (Например sdb1).
sudo swapoff -a         # Отключает все swap-разделы/файлы
sudo rm -f /swapfile    # Удалить файл подкачки с диска
sudo nano /etc/fstab    # Уберите самую нижнюю строчку полностью.

4.6. Форсирование использования Clang при сборке пакетов#

В системах на базе ядра Linux различают две основных группы компиляторов, это LLVM и GCC. И те, и другие хорошо справляются с возложенными на них задачами, но LLVM имеет чуть большее преимущество с точки зрения производительности при меньших потерях в качестве конечного кода. Поэтому в целом применение компиляторов LLVM для сборки различных пакетов при задании флага -O3 (максимальная производительность) является совершенно оправданным, и может дать реальный прирост при работе программ.

Компилятором для языков C/C++ в составе LLVM является Clang и Clang++ соответственно. Его использование при сборке пакетов мы и будем форсировать через makepkg.conf

Для начала выполним их установку:

sudo pacman -Syu llvm clang lld mold openmp

Теперь клонируем уже готовый конфигурационный файл /etc/makepkg.conf под новыми именем в домашнюю директорию ~/.makepkg-clang.conf:

cp /etc/makepkg.conf ~/.makepkg-clang.conf

Это поможет нам в случае чего откатиться к использованию компиляторов GCC если возникнут проблемы со сборкой пакетов через LLVM/Clang.

Теперь откроем выше скопированный файл и добавим туда после строки CHOST="x86_64-pc-linux-gnu" следующее:

export CC=clang
export CXX=clang++
export LD=ld.lld
export CC_LD=mold
export CXX_LD=mold
export AR=llvm-ar
export NM=llvm-nm
export STRIP=llvm-strip
export OBJCOPY=llvm-objcopy
export OBJDUMP=llvm-objdump
export READELF=llvm-readelf
export RANLIB=llvm-ranlib
export HOSTCC=clang
export HOSTCXX=clang++
export HOSTAR=llvm-ar
export HOSTLD=ld.lld
export CXXFLAGS="${CFLAGS}"
export LLVM=1
export LLVM_IAS=1
export CCLDFLAGS="$LDFLAGS"
export CXXLDFLAGS="$LDFLAGS"

При использовании Clang из пакета llvm-git (установка описана ниже) стоит включить использование LLVM OpenMP и компоновщика mold, а также другие флаги при сборке пакетов:

CFLAGS="-march=native -mtune=native -O3 -fexceptions -fopenmp \
        -falign-functions=32 -fno-math-errno -fno-trapping-math \
        -fcf-protection=none -mharden-sls=none -Wp,-D_FORTIFY_SOURCE=2 \
        -Wformat -Werror=format-security -fstack-clash-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
export CFLAGS_KERNEL="$CFLAGS"
export CXXFLAGS_KERNEL="$CXXFLAGS"
export CFLAGS_MODULE="$CFLAGS"
export CXXFLAGS_MODULE="$CXXFLAGS"
export KBUILD_CFLAGS="$CFLAGS"
export KCFLAGS="-O3"
export KCPPFLAGS="$KCFLAGS"
LDFLAGS="-Wl,-O3,--sort-common,--as-needed,-lgomp,-z,pack-relative-relocs,-z,relro,-z,now"
LTOFLAGS="-flto=auto"
RUSTFLAGS="-C opt-level=3 -C target-cpu=native -C link-arg=-z -C link-arg=pack-relative-relocs"
#-- Make Flags: change this for DistCC/SMP systems
MAKEFLAGS="-j$(nproc)"
NINJAFLAGS="-j$(nproc)"
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto)

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

Здесь мы используем некоторые флаги которые не рекомендуется использовать с точки зрения безопасности конечного кода для того чтобы увеличить производительность, как например -fcf-protection=none и -mharden-sls=none, но если для вас безопасность такой же важный аспект как и производительность, то замените их на соответствующие флаги на -fstack-clash-protection и -fcf-protection (флаг -mharden-sls можно просто опустить).

Отлично, теперь вы можете собрать нужные вам пакеты (программы) через LLVM/Clang просто добавив к уже известной команде makepkg следующие параметры:

makepkg --config ~/.makepkg-clang.conf -sric -skippgpcheck --skipchecksums

Внимание

Далеко не все пакеты так уж гладко собираются через Clang, в частности не пытайтесь собирать им Wine/DXVK, т.к. это официально не поддерживается и с 98% вероятностью приведет к ошибке сборки. Но в случае неудачи вы всегда можете использовать компиляторы GCC, которые у вас заданы в настройках makepkg.conf по умолчанию, т.е. просто уберите опцию --config ~/.makepkg-clang.conf из команды makepkg.

Мы рекомендуем вам пересобрать наиболее важные пакеты. Например такие как драйвера (то есть mesa, lib32-mesa, если у вас Intel/AMD), Xorg сервер, а также связанные с ним компоненты, или Wayland, критически важные пакеты вашего DE/WM, например: gnome-shell, plasma-desktop. А также композиторы kwin, mutter, picom и т.д. в зависимости от того, чем именно вы пользуетесь.

Больше подробностей по теме вы можете найти в данной статье:

https://habr.com/ru/company/ruvds/blog/561286/

4.6.1. Ускорение работы компиляторов LLVM/Clang#

Дополнительно можно отметить, что после установки Clang вы можете перекомпилировать его самого через себя, т.е. выполнить пересборку Clang с помощью бинарного Clang из репозиториев. Это позволит оптимизировать уже сам компилятор под ваше железо и тем самым ускорить его работу при сборке уже других программ. Аналогичную операцию вы можете проделать и с GCC.

Делается это через пакет в AUR:

# Сборка LLVM
git clone https://aur.archlinux.org/llvm-git
cd llvm-git
makepkg -sric --config /etc/makepkg-clang.conf

4.7. Установка оптимизированных пакетов#

Итак, нативная компиляция - это конечно хорошо, но не у каждого человека есть время заниматься подобными вещами, да и всю систему пересобирать с нативными флагами тоже никто не будет (иначе вам сюда: https://gentoo.org). Возникает вопрос: как сделать все с наименьшим количеством напряга?

Для начала сделаем небольшое отступление. У архитектуры x86_64 различают несколько поколений или "уровней". Это x86_64, x86_64_v2, x86_64_v3 и x86_64_v4 (новейшие процессоры). Различия между этими "поколениями" состоят в применяемом наборе инструкций и возможностей процессора. Например, если вы собираете программу для x86_64_v2, то вы автоматически задействуете инструкции SSE3, SSE4_1 и т.д. При этом такая программа не будет работать на предыдущих поколениях, то есть на процессорах которые не поддерживают набор инструкций x86_64_v2. При этом к x86_64_v2 и другим уровням относятся различные процессоры, как AMD, так и Intel. При этом логично, что чем выше поколение x86_64 поддерживает ваш процессор, тем больше будет производительность за счет использования многих оптимизаций и доп. инструкций. Подробнее об этих уровнях или же поколениях можете прочитать здесь (англ.).

Смысл в том, что существует сторонний репозиторий Arch Linux - ALHP, который содержит все пакеты из официальных репозиториев, но собранных для процессоров x86_64_v2 или x86_64_v3. То есть это те же самые, уже готовые пакеты из официальных репозиториев, но собранные с различными оптимизациями для определенной группы процессоров (поколений x86_64).

Опасно

Прежде чем мы подключим данный репозиторий, нужно обязательно понять к какому поколению относиться ваш процессор, иначе, если вы установите пакеты собранные для x86_64_v3, но ваш процессор при этом не будет относиться к поколению x86_64_v3, то ваша система станет полностью не работоспособной, хотя её и все ещё можно будет восстановить через LiveCD окружение при помощи pacstrap.

Опасно

Оптимизированные пакеты для процессоров Intel поддерживают только полные процессоры серий Core 2 и i3/i5/i7. Многие процессоры Pentium/Celeron не имеют полного набора инструкций, необходимого для использования оптимизированных пакетов. Пользователям этих процессоров следует установить универсальные пакеты или пакеты оптимизированные ниже на один уровень (то есть если у вас поддерживается v3, то подключайте репозиторий с v2 и т.д.), даже если GCC возвращает значение, соответствующее полному набору флагов Core i3/i5/i7, например, Haswell.

Проверить поколение вашего процессора можно следующей командой:

/lib/ld-linux-x86-64.so.2 --help | grep -B 3 -E "x86-64-v2"

После каждого поколения будет написано, поддерживается оно вашим процессором или нет. Например:

Subdirectories of glibc-hwcaps directories, in priority order:
x86-64-v4
x86-64-v3
x86-64-v2 (supported, searched)

Если у вас поддерживается хотя бы x86_64_v2, то вы так же сможете использовать данный репозиторий, ибо он предоставляет пакеты как для x86_64_v2, так и для x86_64_v3. Главное не перепутаете, какое именно у вас поколение.

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

# Ключи для пакетов
git clone https://aur.archlinux.org/alhp-keyring.git
cd alhp-keyring
makepkg -sric

А также список зеркал:

git clone https://aur.archlinux.org/alhp-mirrorlist.git
cd alhp-mirrorlist
makepkg -sric

После этого нужно отредактировать конфиг pacman добавив репозиторий для нужной архитектуры (sudo nano /etc/pacman.conf).

Итак, если ваш процессор поддерживает только x86_64_v2 (как допустим у автора), то пишем следующее:

[core-x86-64-v2]
Include = /etc/pacman.d/alhp-mirrorlist

[extra-x86-64-v2]
Include = /etc/pacman.d/alhp-mirrorlist

[multilib-x86-64-v2]
Include = /etc/pacman.d/alhp-mirrorlist

[core]
Include = /etc/pacman.d/mirrorlist

[extra]
Include = /etc/pacman.d/mirrorlist

[multilib]
Include = /etc/pacman.d/mirrorlist

Если же у вас процессор поддерживает x86_64_v3, то пишем следующее:

[core-x86-64-v3]
Include = /etc/pacman.d/alhp-mirrorlist

[extra-x86-64-v3]
Include = /etc/pacman.d/alhp-mirrorlist

[multilib-x86-64-v3]
Include = /etc/pacman.d/alhp-mirrorlist

[core]
Include = /etc/pacman.d/mirrorlist

[extra]
Include = /etc/pacman.d/mirrorlist

[multilib]
Include = /etc/pacman.d/mirrorlist

После этого выполняем полное обновление системы:

sudo pacman -Syyuu

Перезагружаемся и наслаждаемся результатом (если вы все сделали правильно).