跳转至内容

NVIDIA/技巧和窍门

来自 ArchWiki

修复终端分辨率

由于默认启用了 NVIDIA#fbdevLinux 控制台应该无需额外配置即可使用本机显示器分辨率。

如果您禁用了 fbdev 或使用了旧版本驱动程序,分辨率可能低于预期。作为一种变通方法,您可以在 引导加载程序配置中设置分辨率。

对于 GRUB,请参阅 GRUB/技巧和窍门#设置帧缓冲分辨率 获取详细信息。[1] [2]

对于 systemd-boot,请在 esp/loader/loader.conf 中设置 console-mode。有关详细信息,请参阅 systemd-boot#引导加载程序配置

对于 rEFInd,请在 esp/EFI/refind/refind.conf 中设置 use_graphics_for +,linux[3] 一个小缺点是,这会隐藏内核参数在引导过程中显示。

提示 如果上述方法无法修复您的终端分辨率,则可能需要完全禁用 UEFI 设置中的 Legacy BIOS 模式(通常称为兼容性支持模块、CSM 或 Legacy Boot)。在此之前,请确保所有设备都已配置为使用 UEFI 引导。

使用电视输出

请参阅 Wikibooks:NVIDIA/TV-OUT

X 配置只有一个显示器的电视 (DFP)

如果未自动检测到显示器,X 服务器将回退到某个“默认”屏幕分辨率(通常为 640x480)。当使用 DVI/HDMI/DisplayPort 连接的电视作为主显示器,并且电视关闭或断开连接时启动 X 时,这可能会有问题。

为了强制 NVIDIA 使用正确的分辨率,请将 EDID 的副本存储在文件系统中,以便 X 可以解析该文件而不是从显示器读取 EDID。

要获取 EDID,请启动 nvidia-settings。它会以树状格式显示一些信息,暂时忽略其余设置,选择 GPU(相应的条目应标题为 GPU-0 或类似名称),点击 DFP 部分(同样,DFP-0 或类似名称),点击 Acquire EDID... 按钮,并将其存储在某处,例如 /etc/X11/dfp0.edid

如果前端没有连接鼠标和键盘,EDID 可以仅使用命令行获取。运行具有足够详细程度的 X 服务器来打印 EDID 块

$ startx -- -logverbose 6

X 服务器初始化完成后,关闭它,并使用 nvidia-xconfigXorg 日志文件中提取 EDID 块

$ nvidia-xconfig --extract-edids-from-file ~/.local/share/xorg/Xorg.0.log --extract-edids-output-file ./dfp0.bin

通过将以下内容添加到 Device 部分来编辑 Xorg 配置

/etc/X11/xorg.conf.d/20-nvidia.conf
Option "ConnectedMonitor" "DFP"
Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin"

ConnectedMonitor 选项强制驱动程序将 DFP 识别为已连接。CustomEDID 为设备提供 EDID 数据,这意味着它将像 X 进程期间电视/DFP 已连接一样启动。

这样,就可以在启动时自动启动显示管理器,并在电视开启时仍然有一个可用且配置正确的 X 屏幕。

无显示器(无显示器)分辨率

在无显示器模式下,分辨率会回退到 640x480,VNC 或 Steam Link 使用该分辨率。要以更高的分辨率启动,例如 1920x1080,请在 xorg.confScreen 小节中指定 Virtual 条目

Section "Screen"
   [...]
   SubSection     "Display"
       Depth       24
       Virtual     1920 1080
   EndSubSection
EndSection
提示 使用无显示器模式可能很棘手且容易出错。例如,在无显示器模式下,桌面环境和 nvidia-utils 不提供更改分辨率的图形方式。为了方便设置分辨率,可以使用 DP 或 HDMI 假适配器来模拟连接到该端口的显示器。然后,可以使用 VNC 或 Steam Link 等远程会话正常更改分辨率。

检查电源

NVIDIA X.org 驱动程序还可以用于检测 GPU 的当前电源来源。要查看当前电源,请检查 'GPUPowerSource' 只读参数(0 - AC,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.

虽然完全无害,但您可以通过在 /etc/X11/xorg.conf.d/20-nvidia.conf 中禁用 ConnectToAcpid 选项来摆脱此消息。

Section "Device"
  ...
  Driver "nvidia"
  Option "ConnectToAcpid" "0"
  ...
EndSection

如果您使用的是笔记本电脑,安装并启用 acpid 守护程序可能是一个好主意。

在 Shell 中显示 GPU 温度

有三种方法可以查询 GPU 温度。nvidia-settings 要求您正在使用 X,而 nvidia-sminvclock 则不需要。另请注意,nvclock 目前不适用于较新的 NVIDIA 卡,例如 GeForce 200 系列卡以及嵌入式 GPU,例如 Zotac IONITX 的 8800GS。

nvidia-settings

要在 Shell 中显示 GPU 温度,请使用 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.

此板的 GPU 温度为 49 °C。

为了仅获取温度以供 rrdtoolconky 等实用程序使用

$ nvidia-settings -q gpucoretemp -t
49

nvidia-smi

使用 nvidia-smi,它可以直接从 GPU 读取温度,而无需使用 X,例如在运行 Wayland 或在无显示器服务器上运行时。

要在 Shell 中显示 GPU 温度,请使用 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

为了仅获取温度以供 rrdtoolconky 等实用程序使用

$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits
49

nvclock

安装 nvclockAUR 包。

注意 nvclock 无法访问较新 NVIDIA 卡(如 Geforce 200 系列卡)上的热传感器。

nvclocknvidia-settings/nv-control 报告的温度之间可能存在显著差异。根据 nvclock 作者 (thunderbird) 的这篇帖子nvclock 的值应该更准确。

超频和散热

警告 超频可能会永久损坏您的硬件。您已被警告。

在 nvidia-settings 中启用超频

  • 如果 Xorg 服务器以无根模式运行,则某些超频设置无法应用。请考虑以 root 身份运行 Xorg
  • 您可能还需要以 root 身份运行 nvidia-settings
  • 启用 DRM 内核模式设置可能会导致超频不可用,无论 Coolbits 值如何。

根据驱动程序版本,某些超频功能默认启用。需要通过 Device 部分中的 Coolbits 选项来启用一些不支持的超频功能

Option "Coolbits" "value"
提示 Coolbits 选项可以通过 nvidia-xconfig 轻松控制,该工具会操作 Xorg 配置文件。
# nvidia-xconfig --cool-bits=value

Coolbits 值是其二进制数字系统中的各位之和。各位是

  • 8 (bit 3) - 在 nvidia-settingsPowerMizer 页面上启用额外的超频设置。从 Fermi 架构及更新版本的 337.12 版本开始可用。[4]
  • 16 (bit 4) - 使用 nvidia-settings CLI 选项启用超电压。从 Fermi 架构及更新版本的 346.16 版本开始可用。[5]

如果您使用不支持的驱动程序版本,您可能还需要使用这些位

  • 1 (bit 0) - 在 nvidia-settingsClock Frequencies 页面上启用旧(Fermi 之前)核心的超频。在 343.13 版本中移除。
  • 2 (bit 1) - 设置此位时,驱动程序将“尝试在使用不同显存量的 GPU 时初始化 SLI”。在 470.42.01 版本中移除。
  • 4 (bit 2) - 在 nvidia-settingsThermal Monitor 页面上启用 GPU 风扇速度的手动配置。在 470.42.01 版本中移除。

要启用多个功能,请将 Coolbits 值相加。例如,要启用 Fermi 核心的超频和超电压,请将 Option "Coolbits" "24" 设置为。

Coolbits 的文档可以在 /usr/share/doc/nvidia/html/xconfigoptions.html此处找到。

注意 另一种方法是编辑并重新刷写 GPU BIOS,可以在 DOS 下(推荐)或通过 nvflashNiBiTor 6.0 在 Win32 环境中进行。BIOS 刷写的好处是,不仅可以提高电压限制,而且通常比 Coolbits 等软件超频方法更稳定。 Fermi BIOS 修改教程

设置静态 2D/3D 时钟

使用 内核模块参数 来启用 PowerMizer 以达到最高性能级别(否则 VSync 将无法工作)

/etc/modprobe.d/nvidia.conf
options nvidia NVreg_RegistryDwords="PerfLevelSrc=0x2222"

降低 GPU Boost 时钟

对于 Volta (NV140/GVXXX) GPU 及更高版本,时钟 Boost 的工作方式不同,并且最大时钟会在启动时设置为支持的最高限制。如果您想要此设置,则无需进一步配置。

缺点是功耗效率较低。随着时钟的升高,为保持稳定性需要提高电压,导致功耗、发热和风扇噪音呈非线性增加。因此,降低 Boost 时钟限制将提高效率。

可以通过 nvidia-smi 在 root 权限下更改 Boost 时钟限制

  • 列出支持的时钟速率
    $ nvidia-smi -q -d SUPPORTED_CLOCKS
  • 将 GPU Boost 时钟限制设置为 1695 MHz
    # nvidia-smi --lock-gpu-clocks=0,1695 --mode=1
  • 将内存 Boost 时钟限制设置为 5001 MHz
    # nvidia-smi --lock-memory-clocks=0,5001

为了优化效率,请在运行您喜欢的游戏时使用 nvidia-smi 检查 GPU 利用率。应开启 VSync。降低 Boost 时钟限制将提高 GPU 利用率,因为较慢的 GPU 将花费更多时间来渲染每个帧。通过保持足以跟上刷新率的最低时钟即可实现最佳效率。

例如,在 RTX 3090 Ti 上使用上述设置而不是默认设置,在 4K@60 下玩 Hitman 3 时,功耗降低了 30%,温度从 75 降至 63 度,风扇速度从 73% 降至 57%。

保存超频设置

通常,在 nvidia-settings 界面中插入的时钟和电压偏移在重启后会丢失。幸运的是,有一些工具提供了一个界面,可以在专有驱动程序下进行超频,能够保存用户的超频偏好并在启动时自动应用它们。其中一些工具包括

  • gweAUR - 图形界面,在桌面会话启动时应用设置
  • nvclockAURsystemd-nvclock-unitAUR - 图形界面,在系统启动时应用设置
  • nvocAUR - 基于文本,配置文件位于 /etc/nvoc.d/,在桌面会话启动时应用设置

否则,可以在 nvidia-settings 的命令行接口中,在 启动时设置 GPUGraphicsClockOffsetGPUMemoryTransferRateOffset 属性。例如

$ nvidia-settings -a "GPUGraphicsClockOffset[performance_level]=offset"
$ nvidia-settings -a "GPUMemoryTransferRateOffset[performance_level]=offset"

其中 performance_level 是最高性能级别的编号。如果机器上有多个 GPU,则应指定 GPU ID:[gpu:gpu_id]GPUGraphicsClockOffset[performance_level]=offset

自定义 TDP 限制

本文或本章节的准确性存在争议。

原因:似乎并非所有卡都支持此功能。在我拥有的 3 张卡中:一张桌面 3080 Ti,一张移动 1650 MaxQ,以及一张移动 500 Ada,这仅在 3080 Ti 上起作用;在两台笔记本电脑上,我收到了“GPU 不支持”的警告。移动 GPU 是否无法使用此功能?(请在 Talk:NVIDIA/Tips and tricks 中讨论)

现代 NVIDIA 显卡会限制频率以保持在其 TDP 和温度限制内。为了提高性能,可以更改 TDP 限制,这将导致更高的温度和更高的功耗。

例如,将功率限制设置为 160.30W

# 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

登录时设置风扇速度

本文或本章节的准确性存在争议。

原因:这不起作用,因为 GPU 风扇速度的手动配置需要以 root 身份运行 nvidia-settings(即使 Xorg 本身以 root 身份运行)。(请在 Talk:NVIDIA/Tips and tricks 中讨论)

您可以使用 nvidia-settings 的命令行界面调整显卡的风扇速度。首先,请确保您的 Xorg 配置已在 Coolbits 选项中启用了位 2。

注意 GeForce 400/500 系列卡目前无法通过此方法在登录时设置风扇速度。此方法仅允许在当前 X 会话中通过 nvidia-settings 设置风扇速度。

将以下行放在您的 xinitrc 文件中以在启动 Xorg 时调整风扇。将 n 替换为您想要设置的风扇速度百分比。

nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=n"

您还可以通过增加 GPU 和风扇编号来配置第二个 GPU。

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 之前,使用 GPUCurrentFanSpeed 而不是 GPUTargetFanSpeed[6]

为了能够调整一个以上显卡的风扇速度,请运行

$ nvidia-xconfig --enable-all-gpus
$ nvidia-xconfig --cool-bits=4
注意 在某些笔记本电脑上(包括 ThinkPad X1 ExtremeP51/P52),有两个风扇,但都不是由 nvidia 控制。

使用 NVML 的简单超频脚本

Nvidia Management Library (NVML) 提供了一个 API,可以管理 GPU 的核心和内存时钟偏移以及功率限制。要利用此功能,您可以安装 python-nvidia-ml-pyAUR,然后使用以下 Python 脚本和您期望的设置。此脚本需要在每次重启后以 root 身份运行,以重新应用超频/降压。

#!/usr/bin/env python

from pynvml import *

nvmlInit()

# This sets the GPU to adjust - if this gives you errors or you have multiple GPUs, set to 1 or try other values
myGPU = nvmlDeviceGetHandleByIndex(0)

# The GPU clock offset value should replace "000" in the line below.
nvmlDeviceSetGpcClkVfOffset(myGPU, 000)

# The memory clock offset should be **multiplied by 2** to replace the "000" below
# For example, an offset of 500 means inserting a value of 1000 in the next line
nvmlDeviceSetMemClkVfOffset(myGPU, 000)

# The power limit can be set below in mW - 216W becomes 216000, etc. Remove the below line if you don't want to adjust power limits.
nvmlDeviceSetPowerManagementLimit(myGPU, 000000)

内核模块参数

一些选项可以作为内核模块参数设置,运行 modinfo nvidia 或查看 nv-reg.h 可以获得完整的列表。还可以参考 Gentoo:NVidia/nvidia-drivers#内核模块参数

例如,启用以下参数将启用 PAT 功能 [7],该功能影响内存的分配方式。PAT 最早引入于 Pentium III [8],并且被大多数较新的 CPU 支持(请参阅 wikipedia:Page attribute table#Processors)。如果您的系统支持此功能,它应该会提高性能。

/etc/modprobe.d/nvidia.conf
options nvidia NVreg_UsePageAttributeTable=1

在某些笔记本电脑上,要启用任何 NVIDIA 设置的调整,您必须包含此选项,否则它会响应“不支持设置应用程序时钟”等信息。

/etc/modprobe.d/nvidia.conf
options nvidia NVreg_RegistryDwords="OverrideMaxPerf=0x1"
注意 根据 内核模块#使用 modprobe.d,如果您使用 早期 KMS,则需要重新生成 initramfs

挂起后保留视频内存

默认情况下,NVIDIA Linux 驱动程序仅在系统挂起和恢复时保存和恢复必要的视频内存分配。引述 NVIDIA 的话

由此产生的视频内存内容丢失,部分由用户空间的 NVIDIA 驱动程序和某些应用程序进行补偿,但在退出电源管理周期时可能导致渲染损坏和应用程序崩溃等故障。

“仍处于实验阶段”的接口允许保存所有视频内存(如果磁盘或 RAM 空间足够)。

要保存和恢复所有视频内存内容,需要为 nvidia 内核模块设置 NVreg_PreserveVideoMemoryAllocations=1 内核模块参数。虽然 NVIDIA 默认不设置此参数,但 Arch Linux 会为支持的驱动程序设置此参数,从而使保留功能开箱即用。

要验证 NVreg_PreserveVideoMemoryAllocations 是否已启用,请执行以下操作

# sort /proc/driver/nvidia/params

应有一行 PreserveVideoMemoryAllocations: 1,还有 TemporaryFilePath: "/var/tmp",您可以在下面阅读有关此内容的详细信息。

根据上游要求,支持的驱动程序上默认会启用必要的服务 nvidia-suspend.servicenvidia-hibernate.servicenvidia-resume.service

有关更多详细信息,请参阅 NVIDIA 的文档

  • 当使用 早期 KMS 时,即在 initramfs 中加载 nvidia 模块时,它无法访问 NVreg_TemporaryFilePath,该参数存储了之前的视频内存:如果需要休眠,则不应使用早期 KMS。
  • 根据 内核模块#使用 modprobe.d,如果您使用早期 KMS,则需要重新生成 initramfs
  • 视频内存内容默认保存在 /tmp(一个 tmpfs)。NVIDIA 建议使用其他文件系统以获得最佳性能。如果空间不足以容纳内存,这也需要。
  • 包含文件的选定文件系统需要支持未命名临时文件(例如 ext4 或 XFS),并且具有足够的容量来存储视频内存分配(即比所有 NVIDIA GPU 的内存容量总和至少多 5%)。使用命令 nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 列出系统中所有 GPU 的内存容量。
  • 虽然 nvidia-resume.service 被 NVIDIA 标记为必需,但它可以是可选的,因为其功能也由 systemd-sleep(8) 钩子(/usr/lib/systemd/system-sleep/nvidia)提供,后者会自动调用。请注意,带有 Wayland 的 GDM 会明确要求启用 nvidia-resume.service

动态 Boost

动态 Boost 是一个系统范围的电源控制器,它根据系统上的工作负载来管理 GPU 和 CPU 的功耗。[9]。它可以通过相应地提高功率限制来提高 GPU 密集型应用程序的性能。

主要要求是笔记本电脑配备 Ampere(或更新)GPU。

有关详细说明,请参阅 CPU 频率调整#nvidia-powerd

提示 特别有助于那些无法手动设置功率限制的用户,请参阅 NVIDIA Optimus#低功耗(TDP)

驱动程序持久化

NVIDIA 有一个守护进程,可以选择在启动时运行。在标准的单 GPU X 桌面环境中,持久化守护进程是不需要的,实际上可能会导致问题 [10]。有关更多详细信息,请参阅 NVIDIA 文档的驱动程序持久化部分。

要在启动时启动持久化守护进程,请启用 nvidia-persistenced.service。有关手动使用,请参阅上游文档

强制 YCbCr 4:2:0 子采样

如果您遇到旧输出标准的限制,这些限制仍然可以通过使用 YUV 4:2:0 来缓解,NVIDIA 驱动程序有一个未文档化的 X11 选项来强制执行此操作

Option "ForceYUV420" "True"

这将允许更高的分辨率或刷新率,但会对图像质量产生不利影响。

配置应用程序使用 GPU 渲染

请参阅 PRIME#配置应用程序使用 GPU 渲染