修复终端分辨率
从 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.