.. ARU (c) 2018 - 2022, Pavel Priluckiy, Vasiliy Stelmachenok and contributors

   ARU is licensed under a
   Creative Commons Attribution-ShareAlike 4.0 International License.

   You should have received a copy of the license along with this
   work. If not, see <https://creativecommons.org/licenses/by-sa/4.0/>.

.. _generic-system-acceleration:

***************************
Базовое ускорение системы
***************************

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

.. index:: makepkg-conf, native-compilation, flags, lto
.. _makepkg-conf:

======================
Настройка makepkg.conf
======================

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

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

.. code-block:: shell
  :caption: ``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)"

.. note:: Где "-O2" - **Это не нуль/ноль**

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

.. index:: makepkg, tmpfs, native-compilation
.. _makepkg_tmpfs:

---------------------------------------
Использование 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

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

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

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

  df -h | grep tmpfs

.. index:: makepkg, ccache, native-compilation
.. _enabling_ccache:

-----------------------
Включение ccache
-----------------------

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

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

**Установка** ::

  sudo pacman -S ccache

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

.. code-block:: shell
   :caption: ``nano ~/.makepkg.conf``

   BUILDENV=(!distcc color ccache check !sign)

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

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

.. index:: installation, ananicy, zram, nohang, trim
.. _daemons-and-services:

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

.. index:: zram, swap
.. _zram-generator:

-----------------
zram-generator
-----------------

`zram-generator
<https://aur.archlinux.org/packages/zram-generator/>`__ — демон для
создания блочных устройств ZRAM. ZRAM - это альтернативный механизм
подкачки в ядре Linux, который позволяет избавиться от обычной
подкачки на диске и сжимать неиспользуемые данные прямо внутри памяти
ресурсами CPU. Больше подробностей о том, как именно работает подкачка
и в частности ZRAM вы можете в разделе :ref:`kernel-tuning`. Установка
``zram-generator`` выполняется всего парой команд::

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

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

.. code-block:: shell
   :caption: ``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 объем данных больший, чем вы в
принципе можете уместить в ОЗУ.

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

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


.. index:: oom, systemd
.. _oom_killer:

---------------
systemd-oomd
---------------

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

  sudo systemctl enable --now systemd-oomd

.. index:: ananicy, cpu, io, renice
.. _ananicy_cpp:

--------------
Ananicy CPP
--------------

`Ananicy CPP <https://gitlab.com/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


.. index:: ssd, trim, systemd
.. _trim:

-----
TRIM
-----

`TRIM
<https://ru.wikipedia.org/wiki/Trim_(команда_для_накопителей)>`__ -
это встроенная команда контроллера для очищения уже неиспользуемых
ячеек на твердотельном накопителе. Её очень полезно периодически
выполнять с целью профилактики SSD. Чтобы это происходило
автоматически раз в неделю рекомендуется включить уже готовую службу::

  sudo systemctl enable fstrim.timer

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

   sudo fstrim -v /

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

.. index:: pacman, cache, cleaner
.. _pacman_cleaner:

-----------------------------------
Автоматическая очистка кэша pacman
-----------------------------------

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

.. code-block:: shell
  :caption: ``/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

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

.. code-block:: shell
  :caption: ``/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

.. index:: irq, kernel, latency
.. _irqbalance:

-------------
irqbalance
-------------

`irqbalance <https://github.com/Irqbalance/irqbalance>`__ - это демон,
что автоматически балансирует обработку прерываний по ядрам
процессора. ::

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

.. index:: systemd, disabling, services, gsd, cinnamon
.. _disabling-unnecessary-services:

=========================
Отключение лишних служб
=========================

Мы разобрались с установкой и включением полезных служб, теперь
неплохо было бы отключить все лишнее, что есть в системе. Для этого
прежде всего нужно проанализировать какие службы тормозят запуск
системы при помощи следующей команды: ``systemd-analyze blame`` - она
отсортирует все службы по скорости их загрузки. Не следует торопиться
и отключать все подряд, нужно внимательно вчитываться в описание
каждой службы. Стоит обратить свое внимание также на пользовательские
службы рабочих окружений KDE Plasma, GNOME и Cinnamon (если вы их не
используете, то можете просто пропустить разделы связанные с ними).

.. index:: services, daemons, file-indexing, tracker3
.. _disabling-file-indexing:

-----------------------------
Службы индексирования файлов
-----------------------------

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

В Linux подобные службы есть только у рабочих окружений GNOME и KDE
Plasma. В KDE Plasma встроенным файловым индексатором является Baloo,
который отличается своей склонностью часто "подтекать" с точки зрения
потребления памяти, а в GNOME есть Tracker 3, который хоть и менее
прожорливый по сравнению с аналогом от KDE, но все ещё потребляет не
мало ресурсов.

Так как отключение всех подобных служб может положительно влиять на
жизненный цикл вашего носителя, то рекомендуется выполнить это сразу
после установки в зависимости от вашего рабочего окружения:

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask tracker-extract-3 tracker-miner-fs-3 \
            tracker-miner-fs-control-3 tracker-miner-rss-3 tracker-writeback-3 \
            tracker-xdg-portal-3
         rm -rf ~/.cache/tracker ~/.local/share/tracker

   .. tab-item:: KDE Plasma

      ::

         balooctl6 suspend
         balooctl6 disable
         balooctl6 purge

.. warning:: Обратите внимание, что после отключения встроенный поиск
   в GNOME и KDE Plasma может работать немного медленнее.

.. index:: services, gnome, cinnamon, gsd, csd
.. _disabling_gcsd_services:

------------------------------------------------
Отключение пользовательских служб GNOME/Cinnamon
------------------------------------------------

GSD (gnome-settings-daemon) - это, как следует из названия, службы
настройки GNOME и связанных приложений. Если отойти от строгого
определения, то это просто службы-настройки на все случаи жизни,
которые просто висят у вас в оперативной памяти в ожидании когда вам,
или другому приложению, к примеру, понадобиться настроить или
интегрировать поддержку планшета Wacom в рабочее окружение, или для
уведомления вас о различных событиях, таких как недостаточное место на
диске или начале печати, а также для применения изменений совершенных
в настройках GNOME на лету. Так как другое рабочее окружение - Cinnamon,
является форком GNOME 3, то оно также имеет собственные службы
настройки, называемые CSD службами, и большая часть из них являются
"близницами" тех служб, которые есть в GNOME, поэтому их функционал во
многом совпадает. Все команды по отключению служб с одинаковым
назначением в обоих окружения будут продублированы.

Служба интеграции рабочего окружения с графическим планшетом Wacom.
Позволяет настраивать яркость планшета средствами окружения (GNOME или
Cinnamon). Если у вас такого нет - смело отключайте:

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask org.gnome.SettingsDaemon.Wacom.service

   .. tab-item:: Cinnamon

      ::

         cp -v /etc/xdg/autostart/cinnamon-settings-daemon-wacom.desktop ~/.config/autostart
         echo "Hidden=true" >> ~/.config/autostart/cinnamon-settings-daemon-wacom.desktop

Служба уведомления о начале печати. Если нет принтера или
вам просто не нужны эти постоянные уведомления - отключаем:

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask org.gnome.SettingsDaemon.PrintNotifications.service

   .. tab-item:: Cinnamon

      ::

         cp -v /etc/xdg/autostart/cinnamon-settings-daemon-print-notifications.desktop ~/.config/autostart
         echo "Hidden=true" >> ~/.config/autostart/cinnamon-settings-daemon-print-notifications.desktop

Службы управления цветовыми профилями дисплея и принтеров. Если вы
отключите данную службу, то не будет работать тёплый режим экрана
(Системный аналог Redshift):

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask org.gnome.SettingsDaemon.Color.service

   .. tab-item:: Cinnamon

      ::

         cp -v /etc/xdg/autostart/cinnamon-settings-daemon-color.desktop ~/.config/autostart
         echo "Hidden=true" >> ~/.config/autostart/cinnamon-settings-daemon-color.desktop

Отключение службы управления специальными возможностями системы:

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask org.gnome.SettingsDaemon.A11ySettings.service

   .. tab-item:: Cinnamon

      ::

         cp -v /etc/xdg/autostart/cinnamon-settings-daemon-a11y-*.desktop ~/.config/autostart
         echo "Hidden=true" >> ~/.config/autostart/cinnamon-settings-daemon-a11y-*.desktop

.. attention:: Не отключать данную службу людям с ограниченными
   возможностями (инвалидам)!

Службы управления беспроводными интернет-подключениями и Bluetooth. Не
рекомендуется отключать для ноутбуков с активным использованием Wi-Fi
и Bluetooth, но если вы используете настольный ПК без использования
беспроводных технологий, то смело отключайте:

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask org.gnome.SettingsDaemon.Wwan.service
         systemctl --user mask org.gnome.SettingsDaemon.Rfkill.service

   .. tab-item:: Cinnamon

      ::

         cp -v /etc/xdg/autostart/cinnamon-settings-daemon-rfkill.desktop ~/.config/autostart
         echo "Hidden=true" >> ~/.config/autostart/cinnamon-settings-daemon-rfkill.desktop

Отключение службы защиты от неавторизованных USB устройств при
блокировке экрана:

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask org.gnome.SettingsDaemon.UsbProtection.service

.. note:: Данная служба может быть полезна если у вас ноутбук и вы
   часто посещаете вместе ним общественные места.

Службу для автоматической блокировки экрана. Можете отключить по
собственному желанию:

.. tab-set::

   .. tab-item:: GNOME

      ::

         systemctl --user mask org.gnome.SettingsDaemon.ScreensaverProxy.service

   .. tab-item:: Cinnamon

      ::

         cp -v /etc/xdg/autostart/cinnamon-settings-daemon-screensaver-proxy.desktop ~/.config/autostart
         echo "Hidden=true" >> ~/.config/autostart/cinnamon-settings-daemon-screensaver-proxy.desktop

Служба для автоматического управления общим доступом к файлам и
директориям. Если никогда не пользовались, можете отключить:

.. tab-set::

   .. tab-item:: GNOME

      ::


         systemctl --user mask org.gnome.SettingsDaemon.Sharing.service

.. note:: Данная служба есть только в окружении GNOME.

Служба интеграции рабочего окружения с карт-ридером. Если у вас
карт-ридера нет, то смело отключайте:

.. tab-set::

   .. tab-item:: GNOME

     ::

        systemctl --user mask org.gnome.SettingsDaemon.Smartcard.service

   .. tab-item:: Cinnamon

     ::

        cp -v /etc/xdg/autostart/cinnamon-settings-daemon-smartcard.desktop ~/.config/autostart
        echo "Hidden=true" >> cinnamon-settings-daemon-smartcard.desktop

Служба автоматического оповещения вас о недостаточном количестве
свободного места на диске. Если вы делаете это самостоятельно при
помощи специальных средств, как например Baobab, то можно отключить
данную службу:

.. tab-set::

   .. tab-item:: GNOME

     ::

        systemctl --user mask org.gnome.SettingsDaemon.Housekeeping.service

   .. tab-item:: Cinnamon

     ::

        cp -v /etc/xdg/autostart/cinnamon-settings-daemon-housekeeping.desktop ~/.config/autostart
        echo "Hidden=true" >> cinnamon-settings-daemon-housekeeping.desktop


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

.. tab-set::

   .. tab-item:: GNOME

     ::

        systemctl --user mask org.gnome.SettingsDaemon.Power.service

   .. tab-item:: Cinnamon

     ::

        cp -v /etc/xdg/autostart/cinnamon-settings-daemon-power.desktop ~/.config/autostart
        echo "Hidden=true" >> cinnamon-settings-daemon-power.desktop

Служба интеграции работы буфера обмена c Cinnamon. Если вы никогда не
пользовались виджетом истории буфера обмена в трее, то можете
отключить данную службу:

.. tab-set::

   .. tab-item:: Cinnamon

     ::

        cp -v /etc/xdg/autostart/cinnamon-settings-daemon-clipboard.desktop ~/.config/autostart
        echo "Hidden=true" >> cinnamon-settings-daemon-clipboard.desktop

.. note:: Данная служба есть только в окружении Cinnamon.

Служба для автоматического подстраивания интерфейса Cinnamon при
повороте дисплея. Если у вас нет сенсорного экрана или поддержки
переворота дисплея - смело отключайте:

.. tab-set::

   .. tab-item:: Cinnamon

     ::

        cp -v /etc/xdg/autostart/cinnamon-settings-daemon-orientation.desktop ~/.config/autostart
        echo "Hidden=true" >> cinnamon-settings-daemon-orientation.desktop

.. note:: Данная служба есть только в окружении Cinnamon.

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

.. tab-set::

   .. tab-item:: GNOME

     ::

        systemctl --user unmask --now СЛУЖБА

   .. tab-item:: Cinnamon

     ::

        rm ~/.config/autostart/cinnamon-settings-daemon-СЛУЖБА.desktop

Служба вернется в строй после перезагрузки рабочего окружения.

.. index:: service, daemons, plasma
.. _disabling-plasma-daemons:

---------------------------------
Отключение ненужных служб Plasma
---------------------------------

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

Настройка служб происходит в графических настройках Plasma, в разделе
"*Запуск и завершение*" -> *"Управление службами"*

.. image:: https://codeberg.org/ventureo/ARU/raw/branch/main/archive/DE-Optimizations/images/image12.png

.. list-table:: Список служб рекомендуемых к отключению
   :widths: 25 75
   :header-rows: 1

   * - Название службы
     - Описание
   * - Запуск системного монитора
     - Отслеживает нажатие клавиш Ctrl+Esc для запуска системного
       монитора. Не думаю, кто-либо активно этим пользовался ранее,
       поэтому лучше отключить.
   * - Напоминание об установке расширения браузера
     - Довольно бесполезная служба, отключаем.
   * - Bluetooth
     - Отключайте, если у вас нет модуля Bluetooth или вы им не
       пользуйтесь (Данный пункт может отсутствовать если не установлен
       пакет ``bluedevil``).
   * - Настройки прокси-серверов
     - Отключайте, если не используете системный прокси/VPN.
   * - Учётный записи
     - Нужна только если у вас больше одной учетной записи на
       компьютере.
   * - Сенсорная панель
     - Отключаем, если сенсорная панель отсутствует или вы ей не
       пользуетесь.
   * - Обновление местоположения для коррекции цвета
     - Служба, которая автоматически корректирует "температуру"
       теплого режима экрана в зависимости от вашего местоположения.
       Отключайте, если не используете теплый режим или не желаете
       раскрывать собственное местоположение.
   * - Модуль шифрования папок рабочей среды Plasma
     - Отключайте, если вы не используете шифрование для отдельных
       файлов или имеете уже шифрование для всей системы.
   * - Слежение за изменениями в URL
     - Работает только в сетевых папках просматриваемых через Dolphin.
       Если вы не часто используете сетевые диски или сервисы, то
       рекомендуется отключить.
   * - Слежение за свободным местом на диске
     - Автоматически оповещает вас о недостаточном количестве
       свободного места на диске. Если вы делаете это самостоятельно
       при помощи специальных виджетов, то можно отключить.
   * - SMART
     - Автоматически отслеживает состояние вашего SSD носителя.
       Довольно полезная служба, но если вы предпочитаете делать это
       самостоятельно, то можете отключить.
   * - Действия
     - Обеспечивает действий назначенных пользователем в настройках
       Dolphin/других приложения. Если вы их не используете, то можете
       отключить.
   * - Модуль для управления сетью
     - Добавляет системный лоток виджет для управления сетевыми
       подключениями. Отключайте, если не используете NetworkManager.
   * - Состояние сети
     - Оповещает пользователя в случае неработоспособности
       интернет-соединения. Так как понять это можно будет и по
       косвенным признакам, то службу можно отключать.
   * - Служба синхронизации параметров GNOME/GTK
     - Осуществляет смену темы применяемой для приложений GTK на лету.
       Если отключить, то смена GTK темы будет применяться только
       после перезагрузки оболочки.
   * - Обновление папок поиска
     - Автоматически обновляет результаты поиска файлов. Отключаем на
       свое усмотрение. Кроме того, судя по всему работает только в
       Dolphin.
   * - Служба локальных сообщений
     - Формирует уведомления для сообщений передаваемых между
       терминалами через команды wall и write. В настоящий момент это
       очень редко используется и может быть нужно только на
       многопользовательских системах, поэтому можно смело отключать.
   * - Подключение внешних носителей
     - Автоматически примонтирует внешние устройства при их
       подключении. Например, такие как USB-флешки. Отключайте на свое
       усмотрение, но в целях безопасности рекомендуется отключить.
   * - Часовой пояс
     - Информирует другие приложения об изменении системного часового
       пояса. Довольно редко применимо, можно отключить.
   * - Фоновая служба меню приложений
     - Немного странная служба. По своему назначению она осуществляет
       обновление "Меню Приложений" при появлении новых ярлыков,
       однако даже при её отключении этот функционал работает.
       Отключайте на свое усмотрение.

.. index:: installation, lowlatency, audio, pipewire
.. _lowlatency-audio:

==================================
Низкие задержки звука (PipeWire)
==================================

`PipeWire <https://wiki.archlinux.org/title/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

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

.. note:: 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. См. раздел
ниже.

.. index:: pipewire, lowlatency, audio, sound
.. _pipewire_setup:

--------------------
Настройка PipeWire
--------------------

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

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

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

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

.. code-block:: shell
  :caption: ``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 = 2048
   }

Обратите внимание на параметры ``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 ]

.. index:: pipewire, upmix, 5.1, sound
.. _upmixing-5.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

.. index:: pipewire, choppy, high-load, cpu, sound
.. _choppy-audio:

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

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

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

.. code-block:: shell
  :caption: ``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 = 2048
     default.clock.quantum = 4096
     default.clock.max-quantum = 8192
   }

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

-----------------
Реализации JACK
-----------------

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

.. image:: images/jack-implementations.png

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

Для официальных примеров клиентов и инструментов JACK установите
`jack-example-tools
<https://archlinux.org/packages/extra/x86_64/jack-example-tools/>`_.

Для альтернативной поддержки ALSA MIDI в jack2 установите `a2jmidid.
<https://archlinux.org/packages/community/x86_64/a2jmidid/>`_.

Для поддержки dbus с jack2 установите `jack2-dbus
<https://archlinux.org/packages/extra/x86_64/jack2-dbus/>`_
(рекомендуется).

.. index:: lowlatency, audio, alsa
.. _alsa:

-------------
Простая ALSA
-------------

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

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

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

.. index:: startup-acceleration, networkmanager, service, 
.. _startup-acceleration:

===========================
Ускорение загрузки системы
===========================


.. index:: startup-acceleration, hdd, lz4, mkinitcpio
.. _speed-up-initramfs-unpack:

-------------------------------
Ускорение распаковки initramfs
-------------------------------

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

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

.. code-block:: shell
  :caption: ``/etc/mkinitcpio.conf``

   COMPRESSION="lz4"
   COMPRESSION_OPTIONS=(-9)

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

  sudo mkinitcpio -P

.. index:: startup-acceleration, hdd, ssd, systemd, mkinitcpio
.. _speed-up-systemd-startup:

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

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

.. code-block:: shell
   :caption: sudo nano /etc/mkinitcpio.conf

    HOOKS=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck)

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

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

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

  sudo mkinitcpio -P

.. index:: sqlite3, cache, vacuum
.. _sqlite_cache_optimizing:

==============================
Оптимизация баз данных SQLite
==============================

Базы данных типа SQLite часто используется для локального хранения с целью
кэширования тех или иных данных. Например, Firefox использует SQLite базу
внутри текущего профиля для хранения всех пиктограм ранее посещаемых сайтов.
Базы такого типа поддаются оптимизации занимаемого места на диске через
специальную операцию ``VACUUM``.

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

  find ~/ -type f -regextype posix-egrep -regex '.*\.(db|sqlite)' \
    -exec bash -c '[ "$(file -b --mime-type {})" = "application/vnd.sqlite3" ] && sqlite3 {} "VACUUM; REINDEX;"' \; 2>/dev/null

.. warning:: Перед запуском данной команды рекомендуется закрыть все
   приложения, так как операция ``VACUUM`` не может быть выполнена для открытых
   и используемых в данный момент баз данных.

Данную команду рекомендуется периодически выполнять вручную или при помощи
systemd-таймера по аналогии с очисткой кэша pacman как было показано выше.

.. index:: mesa, amd
.. _mesa_tweaks:

======================
Твики драйверов Mesa
======================

.. index:: amd, sam, bar
.. _force_amd_sam:

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

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

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

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

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

.. code-block:: shell
   :caption: ``sudo nano /etc/environment``

   RADV_PERFTEST=sam # Только для Vulkan

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

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

.. index:: amd, tweaks
.. _bug_solution_for_vega:

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

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

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

.. code-block:: shell
   :caption: ``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

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

.. code-block:: shell
   :caption: ``sudo nano /etc/enviroment``

   AMD_DEBUG=nodcc

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

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

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

.. index:: intel, amd, mesa, tweaks
.. _multithreaded_opengl:

--------------------------------
Многопоточная OpenGL обработка
--------------------------------

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

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

.. _adriconf: https://archlinux.org/packages/community/x86_64/adriconf/

