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/提示和技巧
新增話題