NVIDIA (Русский)/Tips and tricks (Русский)
Исправление разрешения терминала
После перехода с драйвера nouveau вы можете заметить, что разрешение экрана в терминале уменьшилось. Для решения можно настроить разрешение через загрузчик.
Для GRUB смотрите раздел GRUB/Tips and tricks#Setting the framebuffer resolution. [1] [2]
Для systemd-boot установите console-mode
в esp/loader/loader.conf
, смотрите systemd-boot (Русский)#Настройка.
Для rEFInd добавьте use_graphics_for +,linux
в esp/EFI/refind/refind.conf
. [3] Небольшая оговорка заключается в том, что это скроет отображение параметров ядра во время загрузки.
Использование ТВ-выхода
Смотрите Wikibooks:NVIDIA/TV-OUT.
X с телевизором (DFP) в качестве единственного дисплея
Если сервер X не обнаруживает подключенные мониторы, он откатывается на использование аналогового вывода (CRT-0). Это может стать проблемой при подключении ТВ через DVI в качестве основного монитора, если сервер X был запущен при выключенном ТВ или он был не подключен.
Для принудительного использования DFP драйвером NVIDIA сохраните копию EDID в файловой системе там, где его сможет прочитать сервер X, вместо чтения EDID с ТВ/DFP.
Для получения EDID запустите nvidia-settings, в нём внутри раздела нужной видеокарты (должен называться «GPU-0» или типа того) выберите пункт DFP («DFP-0» или что-то похожее), нажмите кнопку Acquire EDID... и сохраните файл куда-нибудь, например в /etc/X11/dfp0.edid
.
Если у вас не подключена мышь и клавиатура, EDID можно получить через командную строку. Запустите сервер X с нужным логированием для вывода блока EDID:
$ startx -- -logverbose 6
После окончания инициализации сервера X закройте его; журнал будет сохранён в /var/log/Xorg.0.log
. Извлеките блок EDID с помощью nvidia-xconfig:
$ nvidia-xconfig --extract-edids-from-file=/var/log/Xorg.0.log --extract-edids-output-file=/etc/X11/dfp0.bin
Отредактируйте xorg.conf
, добавив в секцию Device
строки:
Option "ConnectedMonitor" "DFP" Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin"
Опция ConnectedMonitor
принуждает драйвер распознавать DFP так, как будто он подключен. CustomEDID
предоставляет данные EDID для устройства и говорит, что при загрузке ТВ/DFP как бы был подключен во время процесса запуска X.
Таким образом можно автоматически запускать менеджер экрана при загрузке, иметь рабочий и настроенный экран для X до включения питания ТВ.
Если вышеуказанные изменения не работают, в xorg.conf
в секции Device
вы можете попробовать удалить строку Option "ConnectedMonitor" "DFP"
и добавить следующие строки:
Option "ModeValidation" "NoDFPNativeResolutionCheck" Option "ConnectedMonitor" "DFP-0"
Опция драйвера NVIDIA NoDFPNativeResolutionCheck
предотвращает отключение всех режимов, которые не подходят к основному разрешению.
Разрешение без подключенных мониторов
В headless-режиме выставляется разрешение 640x480, которое будет использоваться в VNC или Steam Link. Чтобы выставить разрешение побольше, например 1920x1080, пропишите Virtual
в подсекции Screen
:
Section "Screen" [...] SubSection "Display" Depth 24 Virtual 1920 1080 EndSubSection EndSection
Проверка источника питания
С помощью драйвера NVIDIA можно узнать текущий источник питания видеокарты. Для этого нужно получить значение параметра 'GPUPowerSource' с помощью утилиты nvidia-settings
(0 — питание от сети, 1 — питание от батареи):
$ nvidia-settings -q GPUPowerSource -t
1
Прослушивание событий ACPI
Драйверы NVIDIA автоматически пытаются подключиться к демону acpid и получать уведомления о событиях ACPI (подключение/отключение источника питания, некоторые горячие клавиши и т.д.). Если соединение завершается неудачей, то X.org выведет следующее предупреждение:
~/.local/share/xorg/Xorg.0.log
NVIDIA(0): ACPI: failed to connect to the ACPI event daemon; the daemon NVIDIA(0): may not be running or the "AcpidSocketPath" X NVIDIA(0): configuration option may not be set correctly. When the NVIDIA(0): ACPI event daemon is available, the NVIDIA X driver will NVIDIA(0): try to use it to receive ACPI event notifications. For NVIDIA(0): details, please see the "ConnectToAcpid" and NVIDIA(0): "AcpidSocketPath" X configuration options in Appendix B: X NVIDIA(0): Config Options in the README.
Вы можете запретить вывод этого сообщения, отключив опцию ConnectToAcpid
в вашем конфигурационном файле:
/etc/X11/xorg.conf.d/20-nvidia.conf
Section "Device" ... Driver "nvidia" Option "ConnectToAcpid" "0" ... EndSection
Однако если у вас ноутбук, то, возможно, более грамотным решением проблемы станет установка и запуск демона acpid.
Отображение температуры видеокарты в терминале
Существует три метода запроса температуры видеокарты. nvidia-settings требует использования X, nvidia-smi или nvclock — не требуют. Также обратите внимание, что nvclock в настоящее время не работает с новыми картами NVIDIA, такими как карты серии GeForce 200, а также интегрированными графическими решениями, такими как Zotac IONITX 8800GS.
nvidia-settings
Для отображения температуры графического ядра в терминале используйте nvidia-settings как указано ниже:
$ nvidia-settings -q gpucoretemp
Attribute 'GPUCoreTemp' (hostname:0[gpu:0]): 49. 'GPUCoreTemp' is an integer attribute. 'GPUCoreTemp' is a read-only attribute. 'GPUCoreTemp' can use the following target types: GPU.
Температура графического процессора этой платы 49 °C.
Пример того, как получить значение температуры для использования в утилитах вроде rrdtool или conky:
$ nvidia-settings -q gpucoretemp -t
49
nvidia-smi
nvidia-smi может читать температуру прямо с графического процессора без использования X, что удобно, например, при работе в Wayland или на сервере без графического интерфейса.
Отображение температуры графического процессора с использованием nvidia-smi:
$ nvidia-smi
Wed Feb 28 14:27:35 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce GTX 1660 Ti Off | 00000000:01:00.0 On | N/A | | 0% 49C P8 9W / 120W | 138MiB / 6144MiB | 2% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | 0 N/A N/A 223179 G weston 120MiB | +-----------------------------------------------------------------------------------------+
Только температура:
$ nvidia-smi -q -d TEMPERATURE
==============NVSMI LOG============== Timestamp : Wed Feb 28 14:27:35 2024 Driver Version : 550.54.14 CUDA Version : 12.4 Attached GPUs : 1 GPU 00000000:01:00.0 Temperature GPU Current Temp : 49 C GPU T.Limit Temp : N/A GPU Shutdown Temp : 95 C GPU Slowdown Temp : 92 C GPU Max Operating Temp : 90 C GPU Target Temperature : 83 C Memory Current Temp : N/A Memory Max Operating Temp : N/A
Пример того, как получить значение температуры для использования в утилитах вроде rrdtool или conky:
$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits
49
nvclock
Установите пакет nvclockAUR.
Могут быть расхождения значений температуры между nvclock и nvidia-settings/nv-control. В соответствии с этим сообщением от автора nvclock (thunderbird), значения, которые выдаёт nvclock, более точные.
Разгон и охлаждение
Включение разгона
- Разгон не работает, если Xorg запущен без прав суперпользователя. Запускайте Xorg с правами root.
- Включение DRM kernel mode setting может привести к тому, что разгон станет недоступным, независимо от значения Coolbits.
Разгон контролируется через опцию Coolbits в секции Device
, позволяя использовать различные неподдерживаемые свойства:
Option "Coolbits" "value"
# nvidia-xconfig --cool-bits=value
Значение Coolbits - сумма его составляющих битов в двоичной системе исчисления. Типы битов:
1
(bit 0) - Включает возможность разгона для старых (до архитектуры Fermi) ядер, вкладка Clock Frequencies в nvidia-settings.2
(bit 1) - Когда бит установлен, драйвер «будет пытаться инициализировать режим SLI, когда используются два графических процессора с разным количеством видеопамяти».4
(bit 2) - Включает ручное управление охлаждением графического процессора вкладка Thermal Monitor в nvidia-settings.8
(bit 3) - Включает возможность разгона на вкладке PowerMizer в nvidia-settings. Доступна с версии 337.12 для архитектур Fermi и новее. [4]16
(bit 4) - Включает возможность повышения напряжения через параметры командной строки nvidia-settings. Доступна с версии 346.16 для архитектур Fermi и новее.[5]
Чтобы включить несколько свойств, сложите значения Coolbits. Например, чтобы включить возможности разгона и повышения напряжения для архитектуры Fermi, установите значение Option "Coolbits" "24"
.
Документация по Coolbits находится в /usr/share/doc/nvidia/html/xconfigoptions.html
и здесь.
Настройка статического 2D/3D разгона
Для включения PowerMizer на максимальную производительность (без этого не будет работать VSync) используйте следующий параметр модуля ядра:
/etc/modprobe.d/nvidia.conf
options nvidia NVreg_RegistryDwords="PerfLevelSrc=0x2222"
Понижение максимальной частоты
На современных моделях видеокарт (как минимум на Ampere (NV170/GAXXX) и более новых) увеличение тактовых частот работает по-другому, и допустимый максимум тактовых частот устанавливается на наибольшее поддерживаемое значение при загрузке системы. Если это то, что вам нужно, то дополнительная настройка не требуется.
Недостатком такого решения является снижение энергоэффективности. При увеличении тактовых частот нужно повышать напряжение для сохранения стабильности, что приводит к нелинейному росту энергопотребления, нагрева и шума вентилятора. Снижение допустимого максимума тактовых частот позволяет повысить эффективность.
Для изменения можно использовать nvidia-smi от имени суперпользователя:
- Просмотр поддерживаемых частот:
$ nvidia-smi -q -d SUPPORTED_CLOCKS
- Изменение частоты графического чипа на 1695 МГц:
# nvidia-smi --lock-gpu-clocks=0,1695 --mode=1
- Изменение частоты видеопамяти на 5001 МГц:
# nvidia-smi --lock-memory-clocks=0,5001
Для оптимизации энергоэффективности используйте nvidia-smi, чтобы проверить нагрузку видеокарты в любимой игре. Вертикальная синхронизация (VSync) должна быть включена. Снижение тактовой частоты увеличит нагрузку на видеокарту, поскольку она, будучи замедленной, будет тратить больше времени на рендеринг каждого кадра. Наилучшая эффективность достигается при использовании самых низких тактовых частот, при которых ещё не возникают подвисания, вызванные стопроцентной нагрузкой. Тогда каждый кадр будет отрисовываться достаточно быстро, чтобы не отставать от частоты обновления экрана.
В качестве примера можно привести использование указанных выше настроек вместо стандартных на RTX 3090 Ti при игре в Hitman 3 в 4K@60, что снижает энергопотребление на 30%, температуру с 75 до 63 градусов и скорость вращения вентилятора с 73% до 57%.
Сохранение настроек разгона
Как правило, изменения частоты и напряжения, сделанные через интерфейс nvidia-settings, не сохраняются, теряясь после перезагрузки. К счастью, существуют инструменты, предоставляющие интерфейс для разгона на проприетарном драйвере, способные сохранять настройки разгона пользователя и автоматически применять их при загрузке. Вот некоторые из них:
- gweAUR — графический, применяет настройки при запуске сеанса рабочего стола
- nvclockAUR и systemd-nvclock-unitAUR — графический, применяет настройки при загрузке системы
- nvocAUR — текстовый, профили представляют собой конфигурационные файлы в
/etc/nvoc.d/
, применяет настройки при запуске сеанса рабочего стола
Помимо них, можно прописывать значения атрибутов GPUGraphicsClockOffset
и GPUMemoryTransferRateOffset
с помощью команды nvidia-settings, добавив её в автозагрузку. Например:
$ nvidia-settings -a "GPUGraphicsClockOffset[performance_level]=offset" $ nvidia-settings -a "GPUMemoryTransferRateOffset[performance_level]=offset"
Где performance_level
— наибольший номер «Performance Level», доступный для вашей видеокарты. Если видеокарт несколько, то нужно указать GPU ID: [gpu:gpu_id]GPUGraphicsClockOffset[performance_level]=offset
.
Изменение лимита TDP
Современные видеокарты NVIDIA сбрасывают частоту, чтобы оставаться в пределах своего TDP и температуры. Для повышения производительности можно изменить предел TDP, что приведёт к повышению температуры и увеличению энергопотребления.
Например, чтобы установить предел энергопотребления на 160,30 Вт:
# nvidia-smi -pl 160.30
Чтобы установить предел во время загрузки системы:
/etc/systemd/system/nvidia-tdp.timer
[Unit] Description=Set NVIDIA power limit on boot [Timer] OnBootSec=5 [Install] WantedBy=timers.target
/etc/systemd/system/nvidia-tdp.service
[Unit] Description=Set NVIDIA power limit [Service] Type=oneshot ExecStart=/usr/bin/nvidia-smi -pl 160.30
И включите юнит nvidia-tdp.timer
.
Установка скорости вентилятора при входе
Вы можете выставить скорость вентилятора вашей графической карты с помощью консольного интерфейса nvidia-settings. Сначала убедитесь в том, что в вашем конфигурационном файле Xorg для опции Coolbits установлен бит 2.
Поместите следующую строку в ваш файл xinitrc для управления вентилятором при запуске Xorg. Замените n
на нужное вам значение скорости вентилятора в процентах.
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=n"
Также вы можете указать и второй графический процессор путём увеличения счётчика графического процесора и вентилятора.
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=n" \ -a "[gpu:1]/GPUFanControlState=1" -a [fan:1]/GPUTargetFanSpeed=n" &
Если вы используете менеджер входа вроде GDM или SDDM, вы можете создать файл настроек. Создайте ~/.config/autostart/nvidia-fan-speed.desktop
и вставьте следующий текст. Снова измените n
на нужное вам значение скорости вентилятора в процентах.
[Desktop Entry] Type=Application Exec=nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=n" X-GNOME-Autostart-enabled=true Name=nvidia-fan-speed
GPUTargetFanSpeed
использовалась опция GPUCurrentFanSpeed
. [6]Чтобы можно было регулировать скорость вращения вентиляторов более чем одной видеокарты, выполните команду:
$ nvidia-xconfig --enable-all-gpus $ nvidia-xconfig --cool-bits=4
Параметры модуля ядра
Некоторые параметры могут быть установлены как параметры модуля ядра, полный список можно получить, выполнив modinfo nvidia
или посмотрев nv-reg.h
. Смотрите также Gentoo:NVidia/nvidia-drivers#Kernel module parameters.
Например, включение следующих параметров включит PAT [7], что влияет на то, как выделяется память. PAT была впервые представлена в Pentium III [8] и поддерживается большинством более новых процессоров (Wikipedia:Page attribute table#Processors). Если ваша система может поддерживать эту функцию, это должно повысить производительность.
/etc/modprobe.d/nvidia.conf
options nvidia NVreg_UsePageAttributeTable=1
На некоторых ноутбуках, чтобы разрешить изменения через nvidia-settings, необходимо включить этот параметр, иначе он будет отвечать «Setting applications clocks is not supported» и т. д.
/etc/modprobe.d/nvidia.conf
options nvidia NVreg_RegistryDwords="OverrideMaxPerf=0x1"
Сохранение видеопамяти в ждущем режиме
По умолчанию драйверы NVIDIA Linux сохраняют и восстанавливают в ждущем режиме только основные распределения видеопамяти. Как сказано в официальной документации:
- Потеря содержимого видеопамяти частично компенсируется драйверами NVIDIA и некоторыми приложениями, но может привести к таким сбоям, как повреждение рендеринга и сбои приложений при выходе из циклов управления питанием.
В драйвере есть экспериментальная функция, позволяющая сохранять всю видеопамять (при наличии достаточного места на диске или в оперативной памяти) перед переходом в сон и восстанавливать её при пробуждении из сна.
Для её включения добавьте параметр модуля ядра NVreg_PreserveVideoMemoryAllocations=1
для модуля nvidia
и включите службы nvidia-suspend.service
, nvidia-hibernate.service
и nvidia-resume.service
.
Подробнее в официальной документации.
- После внесения изменений не забудьте пересобрать образ initramfs, если вы используете ранний KMS.
- По умолчанию содержимое видеопамяти сохраняется в каталог
/tmp
, в котором обычно примонтирована файловая система tmpfs. NVIDIA рекомендует указать другую файловую систему для наилучшей производительности. Это также необходимо, если размер оперативной памяти недостаточен для сохранения всей видеопамяти. Указать другое место сохранения можно с помощью параметра модуля ядраNVreg_TemporaryFilePath
для модуляnvidia
(напримерnvidia.NVreg_TemporaryFilePath=/var/tmp
). - Выбранная вами файловая система должна поддерживать «unnamed temporary files» (например, ext4 или XFS) и иметь достаточно свободного места (то есть минимум на 5% больше общего объёма видеопамяти всех подключенных видеокарт NVIDIA). Узнать объём видеопамяти можно с помощью команды
nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits
. - Включение службы
nvidia-resume.service
необязательно, поскольку она делает то же самое, что уже автоматически делается через хук systemd-sleep(8) (/usr/lib/systemd/system-sleep/nvidia
). Имейте в виду, что GDM с Wayland требует включение этой службы.
Драйвер persistence
Есть демон, который можно запускать при загрузке. В стандартной настольной среде с одной видеокартой демон не нужен и может создавать проблемы [9]. Смотрите раздел Driver Persistence документации NVIDIA для получения подробной информации.
Для запуска демона persistence включите службу nvidia-persistenced.service
. Для использования вручную смотрите документацию разработчика.
Принудительное использование YCbCr с субдискретизацией 4:2:0
Если вы столкнулись с ограничениями старых стандартов вывода, которые можно обойти использованием YUV 4:2:0, в драйвере NVIDIA есть недокументированная опция X11 для его принудительного использования:
Option "ForceYUV420" "True"
Это позволит использовать более высокие разрешения или частоты обновления, но снизит качество изображения.