修復終端解析度
從 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] 一個小問題是,這會在啟動時隱藏內核參數的顯示。
使用電視輸出
使用電視(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 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
nvclock 和 nvidia-settings/nv-control 報告的溫度之間可能存在顯著差異。根據 nvclock 的作者(thunderbird)在 這篇帖子 中的說法,nvclock 的值應該更準確。
超頻與散熱
在 nvidia-settings 中啟用超頻
- 如果 Xorg 伺服器以無根模式運行,則無法應用超頻設置。考慮 以 root 身份運行 Xorg。
- 啟用 DRM 內核模式設置可能會導致超頻不可用,無論 Coolbits 值如何。
超頻通過 Device
部分中的 Coolbits 選項控制,該選項啟用了各種不受支持的功能:
Option "Coolbits" "value"
# 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
和 這裡 找到。
設置靜態 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 控制台界面調整顯卡的風扇速度。首先確保您的 Xorg 配置已在 Coolbits 選項中啟用了位 2。
將以下行放入您的 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
要調整多個顯卡的風扇速度,請運行:
$ nvidia-xconfig --enable-all-gpus $ nvidia-xconfig --cool-bits=4
使用 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)
內核模塊參數
一些選項可以設置為內核模塊參數,完整的列表可以通過運行 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"
保留掛起後的視頻內存
默認情況下,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 的文檔。
- 根據 內核模塊#使用 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.