NVIDIA/技巧和提示

来自 ArchWiki

修复终端分辨率

从 nouveau 过渡可能会导致启动终端以较低的分辨率显示。

对于 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 设置中的传统 BIOS 模式(通常称为兼容性支持模块 CSM 或传统启动)。在继续之前,请确保您的所有设备都配置为使用 UEFI 启动。

使用电视输出

请参阅 Wikibooks:NVIDIA/TV-OUT

X Window 系统仅使用电视 (DFP) 作为显示器

如果没有自动检测到显示器,X 服务器会回退到 CRT-0。当使用 DVI 连接的电视作为主显示器,并且在电视关闭或断开连接时启动 X 时,这可能会成为问题。

要强制 NVIDIA 使用 DFP,请在文件系统中存储 EDID 的副本,以便 X 可以解析该文件,而不是从电视/DFP 读取 EDID。

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

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

$ startx -- -logverbose 6

X 服务器完成初始化后,关闭它,您的日志文件可能位于 /var/log/Xorg.0.log 中。使用 nvidia-xconfig 提取 EDID 块

$ nvidia-xconfig --extract-edids-from-file=/var/log/Xorg.0.log --extract-edids-output-file=/etc/X11/dfp0.bin

通过添加到 Device 部分来编辑 xorg.conf

Option "ConnectedMonitor" "DFP"
Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin"

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

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

如果以上更改不起作用,您可以在 xorg.confDevice 部分下尝试删除 Option "ConnectedMonitor" "DFP" 并添加以下行

Option "ModeValidation" "NoDFPNativeResolutionCheck"
Option "ConnectedMonitor" "DFP-0"

NoDFPNativeResolutionCheck 阻止 NVIDIA 驱动程序禁用所有不适合原生分辨率的模式。

无头 (无显示器) 分辨率

在无头模式下,分辨率会回退到 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 - 交流电,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 Window 系统,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 Window 系统,例如,在运行 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
  • 启用 DRM 内核模式设置可能会导致超频不可用,无论 Coolbits 值如何。

超频通过 Device 部分中的 Coolbits 选项控制,该选项启用各种不受支持的功能

Option "Coolbits" "value"
提示: Coolbits 选项可以使用 nvidia-xconfig 轻松控制,后者会操作 Xorg 配置文件
# nvidia-xconfig --cool-bits=value

Coolbits 值是其组件位在二进制数字系统中的总和。组件位是

  • 1 (位 0) - 在 nvidia-settings 中的时钟频率页面上启用较旧(Fermi 之前)核心的超频。
  • 2 (位 1) - 设置此位后,当“使用不同显存容量的 GPU 时,驱动程序将尝试初始化 SLI”。
  • 4 (位 2) - 在 nvidia-settings 中的散热监视器页面上启用手动配置 GPU 风扇速度。
  • 8 (位 3) - 在 nvidia-settings 中的PowerMizer 页面上启用超频。自 337.12 版本起可用于 Fermi 架构及更高版本。[4]
  • 16 (位 4) - 使用 nvidia-settings CLI 选项启用过压。自 346.16 版本起可用于 Fermi 架构及更高版本。[5]

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

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

注意: 另一种方法是在 DOS(首选)或 Win32 环境下通过 nvflashNiBiTor 6.0 编辑和重刷 GPU BIOS。BIOS 刷写的优点不仅在于可以提高电压限制,而且与 Coolbits 等软件超频方法相比,稳定性通常会提高。Fermi BIOS 修改教程

设置静态 2D/3D 时钟频率

使用内核模块参数以最大性能级别启用 PowerMizer(没有这个 VSync 将无法工作)

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

降低 GPU Boost 时钟频率

对于 Ampere (NV170/GAXXX) GPU 及更高版本,时钟加速的工作方式不同,最大时钟频率在启动时设置为支持的最高限制。如果这正是您想要的,则无需进一步配置。

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

可以使用 nvidia-smi 更改 Boost 时钟频率限制,以 root 身份运行

  • 列出支持的时钟频率
    $ 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 将花费更多时间来渲染每一帧。当利用率达到 100% 时,获得最佳效率的最低时钟频率不会导致卡顿。然后,可以足够快地渲染每一帧以跟上刷新率。

例如,在 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 限制

现代 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

在登录时设置风扇速度

本文或本节需要改进语言、wiki 语法或风格。请参阅 Help:Style 以获取参考。

原因: 有关 Coolbits 的描述,请参阅#在 nvidia-settings 中启用超频。(在 Talk:NVIDIA/技巧和提示 中讨论)

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

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

将以下行放入您的 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" &

如果您使用登录管理器(例如 GDMSDDM),您可以创建一个桌面条目文件来处理此设置。创建 ~/.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)

内核模块参数

本文或本节需要改进语言、wiki 语法或风格。请参阅 Help:Style 以获取参考。

原因: 在不解释它们的作用的情况下给出高级示例是毫无意义的。(在 Talk:NVIDIA/技巧和提示 中讨论)

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

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

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

在某些笔记本电脑上,要启用任何 NVIDIA 设置调整,您必须包含此选项,否则它会回复“Setting applications clocks is not supported”等。

/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,请执行以下操作

# cat /proc/driver/nvidia/params | sort

应该有一行 PreserveVideoMemoryAllocations: 1,以及 TemporaryFilePath: "/var/tmp",您可以在下面阅读有关它的信息。

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

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

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

原因: 当使用早期 KMS 时,即当 nvidia 模块的加载发生在 initramfs 中时,它无法访问存储先前显存的 NVreg_TemporaryFilePath。换句话说,如果需要休眠,则不应使用早期 KMS。(在 Talk:NVIDIA/技巧和提示 中讨论)
注意
  • 根据 内核模块#使用 modprobe.d,如果您使用 早期 KMS,则需要重新生成 initramfs
  • 默认情况下,显存内容由上游保存到 /tmp,这是一个 tmpfsNVIDIA 建议使用其他文件系统以获得最佳性能。如果大小不足以满足内存量,则也需要这样做。因此,Arch Linux 默认在受支持的驱动程序上设置 nvidia.NVreg_TemporaryFilePath=/var/tmp
  • 包含该文件的所选文件系统需要支持未命名的临时文件(例如 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

驱动程序持久性

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

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

强制使用 YCbCr 4:2:0 子采样

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

Option "ForceYUV420" "True"

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