NVIDIA/提示和技巧 - Arch Linux 中文维基

跳转到内容

# NVIDIA/提示和技巧

来自 Arch Linux 中文维基
< NVIDIA
翻译状态：

- 本文（或部分内容）译自 NVIDIA/Tips and tricks，最近一次同步于 2025-01-24，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

这篇文章或章节的翻译质量不佳。

原因：先前使用的 AI 翻译存在较多问题，此页需要修改，目前请先阅读英文 ArchWiki 上的对应页面。（在 Talk:NVIDIA/提示和技巧# 中讨论）

## 修复终端分辨率

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

对于 GRUB，请参阅 GRUB/Tips and tricks#设置帧缓冲分辨率获取详细信息。[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。

## 使用电视（DFP）作为唯一显示器的 X 配置

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

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

要获取 EDID，请启动 `nvidia-settings`。它会以树形格式显示一些信息，暂时忽略其他设置，选择 GPU（相应的条目应标为 "GPU-0" 或类似名称），点击 `DFP` 部分（同样，`DFP-0` 或类似名称），点击 `获取 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

编辑 `xorg.conf`，在 `Device` 部分添加：

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

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

这样，您可以在启动时自动启动显示管理器，并在电视开机时拥有一个正常工作和正确配置的 X 屏幕。

如果上述更改没有生效，您可以在 `xorg.conf` 的 `Device` 部分尝试删除 `Option "ConnectedMonitor" "DFP"` 并添加以下行：

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

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

## 无显示器（Headless）分辨率

在无显示器模式下，分辨率会回退到 640x480，这是 VNC 或 Steam Link 使用的分辨率。要以更高的分辨率（例如 1920x1080）启动，请在 `xorg.conf` 的 `Screen` 子节中指定一个 `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，而 nvidia-smi 或 nvclock 则不需要。另外请注意，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。

为了仅获取温度以用于 rrdtool 或 conky 等工具：

    $ 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

为了仅获取温度以用于 rrdtool 或 conky 等工具：

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

    49

### nvclock

安装 nvclockAUR 包。

注意：nvclock 无法访问较新的 NVIDIA 显卡（如 GeForce 200 系列显卡）上的温度传感器。

nvclock 和 nvidia-settings/nv-control 报告的温度之间可能存在显著差异。根据 nvclock 的作者（thunderbird）在这篇帖子中的说法，nvclock 的值应该更准确。

## 超频与散热

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

### 在 nvidia-settings 中启用超频

注意：

- 如果 Xorg 服务器以无根模式运行，则无法应用超频设置。考虑 以 root 身份运行 Xorg。
- 启用 DRM 内核模式设置可能会导致超频不可用，无论 Coolbits 值如何。

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

    Option "Coolbits" "value"

提示：可以使用 nvidia-xconfig 轻松控制 Coolbits 选项，它会操作 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 环境中通过 nvflash 和 NiBiTor 6.0 编辑并重新刷写 GPU BIOS。刷写 BIOS 的优势在于不仅可以提高电压限制，而且通常比 Coolbits 等软件超频方法更稳定。Fermi BIOS 修改教程

### 设置静态 2D/3D 时钟

使用 kernel module parameter 参数以最大性能级别启用 PowerMizer（没有此设置，VSync 将无法工作）：

    /etc/modprobe.d/nvidia.conf

    options nvidia NVreg_RegistryDwords="PerfLevelSrc=0x2222"

### 降低 GPU Boost 时钟

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

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

可以使用 nvidia-smi 更改提升时钟限制，以 root 身份运行：

- 列出支持的时钟速率：

      $ nvidia-smi -q -d SUPPORTED_CLOCKS

- 将 GPU 提升时钟限制设置为 1695 MHz：

      # nvidia-smi --lock-gpu-clocks=0,1695 --mode=1

- 将内存提升时钟限制设置为 5001 MHz：

      # nvidia-smi --lock-memory-clocks=0,5001

为了优化效率，请使用 nvidia-smi 检查运行您最喜欢的游戏时的 GPU 利用率。VSync 应开启。降低提升时钟限制将增加 GPU 利用率，因为较慢的 GPU 将使用更多时间来渲染每一帧。最佳效率是在不会导致卡顿的最低时钟下实现的，当利用率达到 100% 时会出现卡顿。然后，每一帧都可以渲染得足够快以跟上刷新率。

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

### 保存超频设置

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

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

否则，可以在启动时在 nvidia-settings 的命令行界面中设置 `GPUGraphicsClockOffset` 和 `GPUMemoryTransferRateOffset` 属性。例如：

    $ 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`。

### 在登录时设置风扇速度

本文或本章节的语言、语法或风格需要改进。参考：帮助:风格

原因：请参阅 #在 nvidia-settings 中启用超频 以了解 Coolbits 的描述。（在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" &

如果您使用 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 Extreme 和 P51/P52），有两个风扇，但都不由 nvidia 控制。

### 使用 NVML 的简单超频脚本

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

    #!/usr/bin/env python

    from pynvml import *

    nvmlInit()

    # 这将设置 GPU 进行调整 - 如果这给您带来错误或您有多个 GPU，请设置为 1 或尝试其他值
    myGPU = nvmlDeviceGetHandleByIndex(0)

    # GPU 时钟偏移值应替换下面行中的 "000"。
    nvmlDeviceSetGpcClkVfOffset(myGPU, 000)

    # 内存时钟偏移应 **乘以 2** 以替换下面的 "000"
    # 例如，偏移量为 500 意味着在下一行中插入值 1000
    nvmlDeviceSetMemClkVfOffset(myGPU, 000)

    # 功耗限制可以在下面以 mW 为单位设置 - 216W 变为 216000，等等。如果您不想调整功耗限制，请删除下面这行。
    nvmlDeviceSetPowerManagementLimit(myGPU, 000000)

## 内核模块参数

本文或本章节的语言、语法或风格需要改进。参考：帮助:风格

原因：提供高级示例而不解释其作用是没有意义的。（在Talk:NVIDIA/提示和技巧讨论）

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

例如，启用以下选项将启用 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"

注意：根据 Kernel module#Using modprobe.d，如果您使用 early KMS，则需要 regenerate the 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.service`、`nvidia-hibernate.service` 和 `nvidia-resume.service` 在支持的驱动程序上默认已启用。

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

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

原因： 当使用早期 KMS 时，即在 initramfs 中加载 `nvidia` 模块时，它无法访问存储先前显存的 `NVreg_TemporaryFilePath`。换句话说，如果需要休眠，则不应使用早期 KMS。（在 Talk:NVIDIA/提示和技巧 中讨论）

注意：

- 根据 内核模块#使用 modprobe.d，如果使用 早期 KMS，则需要重新生成 initramfs。
- 显存内容默认保存到 `/tmp`，这是一个 tmpfs。NVIDIA 建议使用其他文件系统以获得最佳性能。如果内存大小不足，这也是必需的。因此，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`。有关手动使用的信息，请参阅上游文档。

## Forcing YCbCr with 4:2:0 subsampling

If you are facing limitations of older output standards that can still be mitigated by using YUV 4:2:0, the NVIDIA driver has an undocumented X11 option to enforce that:

    Option "ForceYUV420" "True"

This will allow higher resolutions or refresh rates but have detrimental impact on the image quality.

分类：​

- 图形
- X 服务器
- 使用“模板:风格”标记的页面或章节

隐藏分类：​

- 使用“模板:糟糕的翻译”标记的页面或章节
- 使用“模板:准确性”标记的页面或章节

NVIDIA/提示和技巧
添加话题