Настройка драйверов GPU#
Настройка закрытого драйвера NVIDIA#
Драйвер NVIDIA - одно из самых болезненных мест с которым сталкиваются пользователи при переходе на Linux. В данном разделе мы рассмотрим как минимизировать количество испытываемой головной боли если вы являетесь несчастным обладателем видеокарты NVIDIA под Linux.
Распространенные мифы о настройке драйвера#
Но прежде чем перейти к исправлению насущных проблем, поговорим о том, чего делать определенно не стоит, то есть о различных вредных советах, которые раньше могли иметь смысл, но сейчас уже нет.
Во-первых, автор категорически не рекомендует выполнять настройку
ваших мониторов и генерацию конфига xorg.conf
в целом через
nvidia-settings или nvidia-xconfig как советовалось делать ранее. В
первую очередь потому, что это просто не нужно, так как современные
версии графического сервера Xorg сами выполняют автонастройку и
определение рабочих мониторов, кроме того большинство рабочих
окружений (DE) в своих настройках уже позволяют вам выставить
требуемую частоту обновления нескольких мониторов и их компановку,
перекрывая при этом все изменения сделанные в файле xorg.conf
,
который статичен и не может подстраиваться под изменения вашей
конфигурации. Например, подключение второго монитора на лету вызовет
проблемы, так как он не указан в xorg.conf
, а автоопределение при
наличии конфигурационного файла перестает работать. Вдобавок,
программа nvidia-settings также является крайне ограниченной в
конфигурациях с гибридной графикой (PRIME) или при использовании
сессий на базе протокола Wayland.
Больше подробностей о проблемах которые могут возникнуть при использовании nvidia-settings в качестве конфигуратора для Xorg можно прочитать здесь:
Автор так же рекомендует полностью отказаться от использования
морально устаревшей опции для xorg.conf
как "Force composition
pipeline", так как современных композиторов, поставляемых вместе с
такими рабочими окружениями как GNOME/KDE/Cinnamon/Xfce и т.д.,
полностью достаточно чтобы предотвратить так называемую проблему
тиринга (разрывов экрана). К тому же "Force composition Pipeline"
имеет побочный эффект, создавая сильные задержки отклика, так
называемый input lag. И вызывает проблемы при работе расширения Vulkan
VK_KHR_present_wait, которое требуется для запуска многих игр при
использовании VKD3D-Proton. Подробнее смотрите здесь:
ValveSoftware/Proton#6869.
Если же вы являетесь пользователем тайлинговых оконных менеджеров (WM), где нет удобных средств настройки из коробки, то автор рекомендует вам использовать такие средства как xrandr и композитор picom.
Повышение производительности CPU на ноутбках с графикой NVIDIA#
Обмен кадрами между iGPU и dGPU в следствии их копирования из VRAM в
ОЗУ может вызывать большую нагрузку на процессор, из-за чего
производительность самого CPU может сильно падать на ноутбуках с
гибридной графикой. Page Attribute Table (PAT) это более
оптимизированный метод управления памятью. Метод PAT создает таблицу
типов разделов по определенному адресу, отображенному в регистре, и
использует архитектуру памяти и набор инструкций более эффективно и
быстро. Для его активации в драйвере NVIDIA нужно указать параметр
NVreg_UsePageAttributeTable=1
. Для этого как обычно создаем файл в
директории /etc/modprobe.d/
или указываем через пробел в тот же
файл, что мы создавали ранее:
/etc/modprobe.d/nvidia-pat.conf
#options nvidia NVreg_UsePageAttributeTable=1
См. также: https://bbs.archlinux.org/viewtopic.php?id=242007
Повышение лимита TDP на ноутбках GPU Ampere и выше#
К сожалению, в новых версиях драйверов NVIDIA невозможно зафиксировать
определенное значение TDP вручную через nvidia-smi. Но для
пользователей ноутбуков с GPU поколения Ampere (RTX 30xx) и выше, есть
обходной путь, который частично решает проблему путем незначительного
повышения лимита TDP. Для этого необходимо включить службу
nvidia-powerd
, которая включает технологию Dynamic Boost:
sudo systemctl enable nvidia-powerd
Например, на ноутбуке с 3050 Mobile это позволяет динамически повышать (т.е. в зависимости от нагрузки на систему) лимит TDP видеокарты с 35 Вт до 40 Вт, без значительного изменения температуры, но с повышением на 10 FPS в бенчмарке Furmark.
Примечание
Обратите внимание, что технология Dynamic Boost работает только тогда, когда ноутбук работает от сети и это также влияет на производительность процессора, изменяя максимальную частоту работы CPU.
Специальные переменные окружения#
Здесь речь пойдет о переменных окружения, которые влияют на поведение драйвера при работе с приложениями которые используют API OpenGL или Vulkan. Указать вы их можете либо в Lutris для конкретных игр, либо в "Параметрах Запуска" игры в Steam ("Свойства" -> "Параметры запуска". После указания всех переменных обязательно добавьте в конце "%command%", для того чтобы Steam понимал, что вы указали именно системные переменные окружения для запуска игры, а не параметры специфичные для этой самой игры).
__GL_MaxFramesAllowed=1
(По умолчанию - 2) - Задает тип
буферизации кадров драйвером. Можете указать значение "3" (Тройная
буферизация) для большего количества FPS и улучшения
производительности в приложениях/играх с VSync. Рекомендуется
указывать 1
для отображения кадров с наименьшей задержкой (т.е. не
использовать буферизацию, подавать кадры так как они есть). Это может
заметно уменьшить значение FPS в играх, но взамен уменьшить задержжку
ввода.
__GL_SHADER_DISK_CACHE_SKIP_CLEANUP=1
(По умолчанию 0) -
отключает ограничение кэша шейдеров OpenGL/Vulkan (по умолчанию
располагается по пути ~/.cache/nvidia
). Рекомендуется для
современных нативных игр и DXVK 2.0+, где размер кэша может достигать
более гигабайта.
__GL_SYNC_DISPLAY_DEVICE
- указывает монитор с частотой которого
драйвер NVIDIA будет осуществлять синхронизацию. Это нужно для
конфигураций с двумя и более мониторами для предотвращения заиканий на
дисплеях с высокой частотой обновления на некоторых композиторах
(например Muffin). Представим, что у вас есть два дисплея, один 144
Гц, другой 60. В переменную следует указать видеовыход, в который
подключен монитор с наибольшей частотой обновления. Чтобы определить
какой монитор, в какой выход подключен можно использовать утилиту
xrandr
. Данную переменную имеет смысл указывать глобально, то есть
в файле /etc/environment
.
/etc/environment
# __GL_SYNC_DISPLAY_DEVICE=HDMI-0 # Это пример, указывайте свое имя выхода
Добавление драйверов GPU в образы initramfs#
Иногда может понадобиться добавить модули для ядра в начальный загрузочный образ (initramfs), который содержит в себе всё необходимое для правильной загрузки ядра, включая необходимые драйверы и программы для монтирования корневого раздела. Добавление модулей в initramfs позволяет избежать некоторых проблем, когда загрузка модулей происходит позже, чем когда они уже фактически нужны для использования. Так происходит из-за параллельной загрузки сервисов (юнитов) в systemd. Например, при использовании графического менеджера входа в систему как SDDM, модули драйвера Nvidia могут быть загружены позже, чем будет запущен сам сервис SDDM. Из-за этого пользователь ловит так называемый "Чёрный экран".
За генерацию загрузочных образов могут отвечать различные программы,
но в Arch Linux по умолчанию для этого используется mkinitcpio
.
Чтобы добавить необходимые модули нужно создать новый файл со
следующим содержанием:
/etc/mkinitcpio.conf.d/10-modules.conf
#MODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
Здесь мы добавляем модули драйвера Nvidia в загрузочный образ initramfs, но в массив (ограничен скобками) вы можете прописать любые модули ядра, которые вы считаете нужными для использования вовремя загрузки.
После добавления новых модулей обязательно нужно пересобрать уже существующие образы initramfs:
sudo mkinitcpio -P
Предупреждение
Обратите внимание, что добавление большого количества
модулей может сильно раздуть размер образа initramfs, поэтому перед
этим убедитесь, что у вас имеется достаточно места в /boot
разделе
(если таковой имеется).
Настройка драйверов Mesa#
Решение проблем работы графики Vega 11 (Спасибо @Vochatrak-az-ezm)#
На оборудовании со встроенным видеоядром Vega 11 может встретиться баг драйвера, при котором возникают случайные зависания графики. Проблема наиболее актуальна для Ryzen 2XXXG и чуть реже встречается на Ryzen серии 3XXXG, но потенциально имеет место быть и на более новых видеоядрах Vega.
Решается через добавление следующих параметров ядра:
/etc/modprobe.d/90-amdgpu.conf
#options amdgpu gttsize=8192 lockup_timeout=1000 gpu_recovery=1 noretry=0 ppfeaturemask=0xfffd3fff deep_color=1
После чего необходимо обновить образы initramfs:
sudo mkinitcpio -P
Для подробностей можете ознакомиться со следующими темами:
Использование OpenGL драйвера Zink#
С недавних пор в Mesa появился новый универсальный драйвер - Zink, который реализует API OpenGL поверх Vulkan. Смысл от такого преобразования состоит в том, чтобы переиспользовать современные возможности Vulkan драйверов на новом оборудовании без необходимости поддерживать драйверы для устаревшего графического API. Так для новых видеокарт NVIDIA при использовании свободного драйвера Nouveau по умолчанию теперь используется Zink, работающий поверх Vulkan драйвера NVK, в качестве реализации OpenGL по умолчанию.
Как показывают проведенные тесты [1], Zink в ряде бенчмарков обгоняет классические драйверы OpenGL по производительности, хотя есть и крайний случаи, в которых Zink сильно отстает по сравнению с предшественниками, поэтому его следует использовать выборочно.
Активировать использование Zink можно используя переменную окружения
MESA_LOADER_DRIVER_OVERRIDE=zink
. Например, команда запуска бенчмарка
glmark2 в терминале с использованием Zink будет выглядеть следующим
образом:
MESA_LOADER_DRIVER_OVERRIDE=zink glmark2
Zink не привязан к конкретной реализации Vulkan, поэтому может работать и при использовании закрытого драйвера NVIDIA, но при этом следует указывать расширенный набор переменных окружения:
env __GLX_VENDOR_LIBRARY_NAME=mesa \
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json \
MESA_LOADER_DRIVER_OVERRIDE=zink glmark2
Предупреждение
Обратите внимание, что Zink не рекомендуется использовать вместе с видеоплеерами и браузерами, так как это может препятствовать работе аппаратного видео ускорения при помощи VA-API.
Ускорение с помощью OpenCL#
В 2021 году разработчики Mesa представили реализацию драйвера OpenCL, написанную на языке Rust, под не замысловатым названием - Rusticl. Начиная с версии Mesa 25.1 данный драйвер полностью заменяет старый, ныне удаленный из кодовой базы, - Clover.
Установка Rusticl уже описывалась в разделе
Установка актуальных драйверов для видеокарты, однако данный драйвер в силу своей
новизны все ещё не используется по умолчанию, поэтому его работу нужно
активировать через переменную окружения RUSTICL_ENABLE
с указанием
в качестве значения используемого Gallium драйвера: Для AMD это
radeonsi
, а для Intel - iris
:
Аппаратное ускорение видео на GPU от AMD#
Начиная с версии Mesa 25.1 у поставляемого по умолчанию драйвера VA-API появилась возможность декодировать видео, проигрываемые внутри браузера Chromium, как на X11, так и на Wayland. Несмотря на это аппаратное ускорение видео для видеокарт AMD в Chromium по умолчанию отключено, и чтобы его активировать нужно прописать несколько дополнительных флагов запуска:
~/.config/chromium-flags.conf
#--enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL
Если вы используете окружение на базе Wayland, то для правильной
работы требуется также добавить флаг
--ozone-platform-hint=wayland
, который активирует нативную работу
браузера без использования XWayland.
Проверить корректность работы аппаратного видео ускорения можно
перейдя на страницу chrome://gpu
и затем в графу "Video
Acceleration Information", в которой должна появится информация о
поддерживаемых кодеках для декодирования.

Аппаратное ускорение видео на старых iGPU от Intel#
К сожалению старые встраиваемые графические процессоры от Intel редко удостаиваются вниманием со стороны разработчиков драйверов, в следствии чего некоторые их возможности в Linux могут быть весьма ограничены. Так с недавних пор Intel прекратила разработку старого драйвера VAAPI, используемого для аппаратного ускорения видео в Linux, в пользу нового драйвера intel-media-driver. Вместе с этим повысились требования к минимально поддерживаемому поколению - теперь это Broadwell (8-е поколение графики Intel), из-за чего пользователи старых поколений, всё ещё имеющих возможность декодировать видео на аппаратном уровне, остались без поддержки. В частности, начиная с версии Chromium 116 аппаратное декодирование видео перестало работать для поколений Haswell/Ivy Bridge/Sandy Bridge/Nehalem (Ironlake).
Однако относительно недавно появился форк драйвера Intel VAAPI для старых поколений графики, так называемый IRQL форк, который решает многие из проблем и позволяет получить правильно работающее аппаратное видео ускорение в Chromium и основанных на нём браузерах. Если вы являетесь обладателем встроенной графики Intel автор настоятельно рекомендует установить вам данный вариант драйвера из AUR:
git clone https://aur.archlinux.org/libva-intel-driver-irql
cd libva-intel-driver-irql
sed -i 's/tag=.*/branch=ilk-fix/g' PKGBUILD
makepkg -sricCf
Обратите внимание, что на поколениях Ironlake и Sandybridge (Gen 5/Gen 6), для правильной работы аппаратного ускорения в Chromium требуется использовать со следующие флаги для запуска и окружение на базе Wayland:
~/.config/chromium-flags.conf
#--enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL
--ozone-platform-hint=wayland
Без использования Wayland сессии вместе с указанными флагами для
Chromium будет наблюдатся чёрный (прозрачный) квадрат вместо видео.
Хотя на остальных поколениях графики Intel использование данных
параметров не обязательно, параметр
AcceleratedVideoDecodeLinuxZeroCopyGL
в окружениях на базе Wayland
активирует использование подсистемы dma-buf для прямого доступа
графического процессора к буферу для отрисовки видео, что может
заметно улучшить производительность.