NVIDIA (Русский)/Tips and tricks (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи NVIDIA/Tips and tricks. Дата последней синхронизации: 15 сентября 2024. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Исправление разрешения терминала

После перехода с драйвера 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] Небольшая оговорка заключается в том, что это скроет отображение параметров ядра во время загрузки.

Совет: Если описанные выше способы не помогли исправить разрешение в терминале, возможно, необходимо полностью отключить Legacy BIOS (часто называемый Compatibility Support Module, CSM или Legacy Boot) в настройках UEFI. Перед этим убедитесь, что все ваши устройства настроены на использование загрузки UEFI.

Использование ТВ-выхода

Смотрите 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
Совет: Использование headless-режима может быть сложным и чреватым ошибками. Например, среды рабочего стола и nvidia-utils не предоставляют графического способа изменения разрешения. Для облегчения настройки разрешения можно использовать фиктивный адаптер DP или HDMI, который имитирует наличие монитора, подключенного к этому порту. Тогда разрешение можно будет изменить обычными способами с помощью удалённого сеанса, такого как VNC или Steam Link.

Проверка источника питания

С помощью драйвера 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, например Geforce 200 series.

Могут быть расхождения значений температуры между nvclock и nvidia-settings/nv-control. В соответствии с этим сообщением от автора nvclock (thunderbird), значения, которые выдаёт nvclock, более точные.

Разгон и охлаждение

Включение разгона

Важно: Помните, что разгон может привести к повреждению оборудования и авторы этой страницы снимают с себя любую ответственность за повреждение оборудования, вся информация, в том числе и возможность разгона, указывается изготовителем в спецификации к оборудованию.
Примечание:
  • Разгон не работает, если Xorg запущен без прав суперпользователя. Запускайте Xorg с правами root.
  • Включение DRM kernel mode setting может привести к тому, что разгон станет недоступным, независимо от значения Coolbits.

Разгон контролируется через опцию Coolbits в секции Device, позволяя использовать различные неподдерживаемые свойства:

Option "Coolbits" "value"
Совет: Опция Coolbits легко контролируется через nvidia-xconfig, которая может управлять файлами конфигурации Xorg:
# 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 и здесь.

Примечание: Также можно отредактировать и перепрошить BIOS видеокарты через DOS (предпочтительнее) или в окружении Win32 с помощью nvflash и NiBiTor 6.0. Преимущество данного способа в том, что он позволяет не только поднять напряжение, но и повысить стабильность по сравнению с программными методами разгона, такими как Coolbits. Руководство по модификации BIOS архитектуры Fermi (англ.)

Настройка статического 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.

Примечание: Для карт GeForce 400/500 series на текущий момент этот метод не устанавливает скорость вентилятора при входе. Также этот метод позволяет настраивать скорость вентилятора только для текущего сеанса X через nvidia-settings.

Поместите следующую строку в ваш файл 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
Примечание: До версии драйвера 349.16 вместо опции GPUTargetFanSpeed использовалась опция GPUCurrentFanSpeed. [6]

Чтобы можно было регулировать скорость вращения вентиляторов более чем одной видеокарты, выполните команду:

$ nvidia-xconfig --enable-all-gpus
$ nvidia-xconfig --cool-bits=4
Примечание: На некоторых ноутбуках (например, X1 Extreme и P51/P52) есть два вентилятора, но nvidia их не контролирует.

Параметры модуля ядра

Некоторые параметры могут быть установлены как параметры модуля ядра, полный список можно получить, выполнив 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"
Примечание: После внесения изменений не забудьте пересобрать образ initramfs, если вы используете ранний KMS.

Сохранение видеопамяти в ждущем режиме

По умолчанию драйверы 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"

Это позволит использовать более высокие разрешения или частоты обновления, но снизит качество изображения.