Настройка драйверов 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 можно прочитать здесь:

https://unix.stackexchange.com/questions/697517/how-to-correlate-xorg-conf-config-for-nvidia-gpu-with-xrandr-detected-screens/697553#697553

Автор так же рекомендует полностью отказаться от использования морально устаревшей опции для 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/ или указываем через пробел в тот же файл, что мы создавали ранее:

sudo nano /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_THREADED_OPTIMIZATIONS=1 (По умолчанию выключено) - Активируем многопоточную обработку OpenGL. Используете выборочно для нативных игр/приложений, ибо иногда может наоборот вызывать регрессию производительности. Некоторые игры и вовсе могут не запускаться с данной переменной (К примеру, некоторые нативно-запускаемые части Metro).

__GL_MaxFramesAllowed=1 (По умолчанию - 2) - Задает тип буферизации кадров драйвером. Можете указать значение "3" (Тройная буферизация) для большего количества FPS и улучшения производительности в приложениях/играх с VSync. Мы рекомендуем задавать вовсе "1" (т.е. не использовать буферизацию, подавать кадры так как они есть). Это может заметно уменьшить значение FPS в играх, но взамен вы получите лучшие задержки отрисовки и реальный физический отклик, т.к. кадр будет отображаться вам сразу на экран без лишних этапов его обработки.

__GL_YIELD="USLEEP" (По умолчанию без значения) - Довольно специфичный параметр, "USLEEP" - снижает нагрузку на CPU и некоторым образом помогает в борьбе с тирингом, а "NOTHING" дает больше 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.

sudo nano /etc/environment#
 __GL_SYNC_DISPLAY_DEVICE=HDMI-0 # Это пример, указывайте свое имя выхода

Добавление драйверов GPU в образы initramfs#

Иногда может понадобиться добавить модули для ядра в начальный загрузочный образ (initramfs), который содержит в себе всё необходимое для правильной загрузки ядра, включая необходимые драйверы и программы для монтирования корневого раздела. Добавление модулей в initramfs позволяет избежать некоторых проблем, когда загрузка модулей происходит позже, чем когда они уже фактически нужны для использования. Так происходит из-за параллельной загрузки сервисов (юнитов) в systemd. Например, при использовании графического менеджера входа в систему как SDDM, модули драйвера Nvidia могут быть загружены позже, чем будет запущен сам сервис SDDM. Из-за этого пользователь ловит так называемый "Чёрный экран".

За генерацию загрузочных образов могут отвечать различные программы, но в Arch Linux по умолчанию для этого используется mkinitcpio. Чтобы добавить необходимые модули нужно создать новый файл со следующим содержанием:

sudo nano /etc/mkinitcpio.conf.d/10-modules.conf#
MODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

Здесь мы добавляем модули драйвера Nvidia в загрузочный образ initramfs, но в массив (ограничен скобками) вы можете прописать любые модули ядра, которые вы считаете нужными для использования вовремя загрузки.

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

sudo mkinitcpio -P

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

Обратите внимание, что добавление большого количества модулей может сильно раздуть размер образа initramfs, поэтому перед этим убедитесь, что у вас имеется достаточно места в /boot разделе (если таковой имеется).

Настройка драйверов Mesa#

Форсирование использования 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/

Решение проблем работы графики 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/environment#
AMD_DEBUG=nodcc

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

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

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

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

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

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

Ускорение с помощью OpenCL#

В 2021 году разработчики Mesa представили релизацию драйвера OpenCL, основанную на языке Rust, под не замысловатым названием - Rusticl Данная реализация призвана заменить старый драйвер Clover, и ныне совместима с OpenCL 3.0.

Приложениям, таким как Handbrake, Darktable и DaVinci Resolve может понадобиться ускорение с помощью данного API на вашей видеокарте.

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

sudo pacman -S opencl-rusticl-mesa

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

sudo nano /etc/environment#
RUSTICL_ENABLE=radeonsi

Примечание

Данная переменная будет работать на видеокартах с драйвером AMDGPU.

sudo nano /etc/environment#
RUSTICL_ENABLE=iris

Примечание

Данный драйвер будет поддерживается на видеокартах, начиная с поколения Broadwell (Gen8) и новее.