NVIDIA/技巧和提示
修复终端分辨率
从 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] 一个小的缺点是,这将隐藏启动期间显示的内核参数。
使用电视输出
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.conf
的 Device
部分下尝试删除 Option "ConnectedMonitor" "DFP"
并添加以下行
Option "ModeValidation" "NoDFPNativeResolutionCheck" Option "ConnectedMonitor" "DFP-0"
NoDFPNativeResolutionCheck
阻止 NVIDIA 驱动程序禁用所有不适合原生分辨率的模式。
无头 (无显示器) 分辨率
在无头模式下,分辨率会回退到 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 Window 系统,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 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
为了仅获取温度以用于 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 时钟频率
使用内核模块参数以最大性能级别启用 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 - 图形化,在桌面会话启动时应用设置
- 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 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)
内核模块参数
一些选项可以设置为内核模块参数,可以通过运行 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"
挂起后保留显存
默认情况下,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
。有关手动使用,请参阅上游文档。
强制使用 YCbCr 4:2:0 子采样
如果您遇到 旧输出标准的限制,仍然可以通过使用 YUV 4:2:0 来缓解,则 NVIDIA 驱动程序有一个未公开的 X11 选项来强制执行此操作
Option "ForceYUV420" "True"
这将允许更高的分辨率或刷新率,但会对图像质量产生不利影响。