NVIDIA/技巧和窍门
修复终端分辨率
由于默认启用了 NVIDIA#fbdev,Linux 控制台应该无需额外配置即可使用本机显示器分辨率。
如果您禁用了 fbdev 或使用了旧版本驱动程序,分辨率可能低于预期。作为一种变通方法,您可以在 引导加载程序配置中设置分辨率。
对于 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 配置只有一个显示器的电视 (DFP)
如果未自动检测到显示器,X 服务器将回退到某个“默认”屏幕分辨率(通常为 640x480)。当使用 DVI/HDMI/DisplayPort 连接的电视作为主显示器,并且电视关闭或断开连接时启动 X 时,这可能会有问题。
为了强制 NVIDIA 使用正确的分辨率,请将 EDID 的副本存储在文件系统中,以便 X 可以解析该文件而不是从显示器读取 EDID。
要获取 EDID,请启动 nvidia-settings。它会以树状格式显示一些信息,暂时忽略其余设置,选择 GPU(相应的条目应标题为 GPU-0 或类似名称),点击 DFP 部分(同样,DFP-0 或类似名称),点击 Acquire EDID... 按钮,并将其存储在某处,例如 /etc/X11/dfp0.edid。
如果前端没有连接鼠标和键盘,EDID 可以仅使用命令行获取。运行具有足够详细程度的 X 服务器来打印 EDID 块
$ startx -- -logverbose 6
X 服务器初始化完成后,关闭它,并使用 nvidia-xconfig 从 Xorg 日志文件中提取 EDID 块
$ nvidia-xconfig --extract-edids-from-file ~/.local/share/xorg/Xorg.0.log --extract-edids-output-file ./dfp0.bin
通过将以下内容添加到 Device 部分来编辑 Xorg 配置
/etc/X11/xorg.conf.d/20-nvidia.conf
Option "ConnectedMonitor" "DFP" Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin"
ConnectedMonitor 选项强制驱动程序将 DFP 识别为已连接。CustomEDID 为设备提供 EDID 数据,这意味着它将像 X 进程期间电视/DFP 已连接一样启动。
这样,就可以在启动时自动启动显示管理器,并在电视开启时仍然有一个可用且配置正确的 X 屏幕。
无显示器(无显示器)分辨率
在无显示器模式下,分辨率会回退到 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 - AC,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。
- 您可能还需要以 root 身份运行 nvidia-settings。
- 启用 DRM 内核模式设置可能会导致超频不可用,无论 Coolbits 值如何。
根据驱动程序版本,某些超频功能默认启用。需要通过 Device 部分中的 Coolbits 选项来启用一些不支持的超频功能
Option "Coolbits" "value"
# nvidia-xconfig --cool-bits=value
Coolbits 值是其二进制数字系统中的各位之和。各位是
8(bit 3) - 在 nvidia-settings 的 PowerMizer 页面上启用额外的超频设置。从 Fermi 架构及更新版本的 337.12 版本开始可用。[4]16(bit 4) - 使用 nvidia-settings CLI 选项启用超电压。从 Fermi 架构及更新版本的 346.16 版本开始可用。[5]
如果您使用不支持的驱动程序版本,您可能还需要使用这些位
1(bit 0) - 在 nvidia-settings 的 Clock Frequencies 页面上启用旧(Fermi 之前)核心的超频。在 343.13 版本中移除。2(bit 1) - 设置此位时,驱动程序将“尝试在使用不同显存量的 GPU 时初始化 SLI”。在 470.42.01 版本中移除。4(bit 2) - 在 nvidia-settings 的 Thermal Monitor 页面上启用 GPU 风扇速度的手动配置。在 470.42.01 版本中移除。
要启用多个功能,请将 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 时钟
对于 Volta (NV140/GVXXX) GPU 及更高版本,时钟 Boost 的工作方式不同,并且最大时钟会在启动时设置为支持的最高限制。如果您想要此设置,则无需进一步配置。
缺点是功耗效率较低。随着时钟的升高,为保持稳定性需要提高电压,导致功耗、发热和风扇噪音呈非线性增加。因此,降低 Boost 时钟限制将提高效率。
可以通过 nvidia-smi 在 root 权限下更改 Boost 时钟限制
- 列出支持的时钟速率
$ 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 将花费更多时间来渲染每个帧。通过保持足以跟上刷新率的最低时钟即可实现最佳效率。
例如,在 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#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 是否已启用,请执行以下操作
# sort /proc/driver/nvidia/params
应有一行 PreserveVideoMemoryAllocations: 1,还有 TemporaryFilePath: "/var/tmp",您可以在下面阅读有关此内容的详细信息。
根据上游要求,支持的驱动程序上默认会启用必要的服务 nvidia-suspend.service、nvidia-hibernate.service 和 nvidia-resume.service。
有关更多详细信息,请参阅 NVIDIA 的文档。
- 当使用 早期 KMS 时,即在 initramfs 中加载
nvidia模块时,它无法访问NVreg_TemporaryFilePath,该参数存储了之前的视频内存:如果需要休眠,则不应使用早期 KMS。 - 根据 内核模块#使用 modprobe.d,如果您使用早期 KMS,则需要重新生成 initramfs。
- 视频内存内容默认保存在
/tmp(一个 tmpfs)。NVIDIA 建议使用其他文件系统以获得最佳性能。如果空间不足以容纳内存,这也需要。 - 包含文件的选定文件系统需要支持未命名临时文件(例如 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。
动态 Boost
动态 Boost 是一个系统范围的电源控制器,它根据系统上的工作负载来管理 GPU 和 CPU 的功耗。[9]。它可以通过相应地提高功率限制来提高 GPU 密集型应用程序的性能。
主要要求是笔记本电脑配备 Ampere(或更新)GPU。
有关详细说明,请参阅 CPU 频率调整#nvidia-powerd。
驱动程序持久化
NVIDIA 有一个守护进程,可以选择在启动时运行。在标准的单 GPU X 桌面环境中,持久化守护进程是不需要的,实际上可能会导致问题 [10]。有关更多详细信息,请参阅 NVIDIA 文档的驱动程序持久化部分。
要在启动时启动持久化守护进程,请启用 nvidia-persistenced.service。有关手动使用,请参阅上游文档。
强制 YCbCr 4:2:0 子采样
如果您遇到旧输出标准的限制,这些限制仍然可以通过使用 YUV 4:2:0 来缓解,NVIDIA 驱动程序有一个未文档化的 X11 选项来强制执行此操作
Option "ForceYUV420" "True"
这将允许更高的分辨率或刷新率,但会对图像质量产生不利影响。