我正在尝试为 Linux 上具有可切换显卡的系统构建显卡监视器(温度、内存百分比、利用率等)。
TLDR:因为我有一个带有运行时 D3 (RTD3) 的 Ampere dGPU,所以显示器需要以某种方式确定 dGPU 何时被其他东西“使用”,而不是查询它以防止它被唤醒。定义“二手”的真正含义是当前的困难。
背景
过去,当我使用 optimus-manager 时,这相对容易,只需nvidia-settings -t -q UsedDedicatedGPUmemory -q ...
在循环中执行,该循环仅在根据 检测到 GPU 开启时运行cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status
。
然而,现在我有一台带有 Nvidia Ampere dGPU 的精美新笔记本电脑,它支持运行时 D3 电源管理,因此我不需要使用 optimus-manager 来强制打开/关闭我的 dGPU。我可以通过上面的 sysfs 命令验证 dGPU 是否正常关闭,然后在运行类似的操作后打开大约 15 秒,prime-run glxinfo | grep -i opengl
然后再次关闭。
现在的问题是,如果我尝试在循环中使用nvidia-settings
(或) 创建系统监视器来查询 dGPU 的运行时信息,则 dGPU 将自动打开。当 dGPU 挂起时,nvidia-smi
我可以使用 的值/sys/bus/pci/devices/0000:01:00.0/power/runtime_status
来 noop 查询循环,但是一旦 dGPU 唤醒并且我的显示器开始查询,它就不会返回睡眠状态(因为每个查询都会使其保持唤醒状态)。
我探索过的想法
我在其他地方发现其他人已经使用了这些/dev/nvidia*
文件并nvidia-smi
确定哪些进程正在“使用”dGPU。在我的情况下,处于空闲状态(即 dGPU 暂停)并且处于nvidia-settings
打开状态:
> sudo lsof /dev/nvidia*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nvidia-pe 796 nvidia-persistenced 4u CHR 195,255 0t0 765 /dev/nvidiactl
nvidia-pe 796 nvidia-persistenced 5u CHR 195,0 0t0 772 /dev/nvidia0
nvidia-pe 796 nvidia-persistenced 6u CHR 195,0 0t0 772 /dev/nvidia0
nvidia-pe 796 nvidia-persistenced 7u CHR 195,0 0t0 772 /dev/nvidia0
nvidia-pe 796 nvidia-persistenced 8u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root mem CHR 195,0 772 /dev/nvidia0
Xorg 1105 root mem CHR 195,255 765 /dev/nvidiactl
Xorg 1105 root 9u CHR 195,255 0t0 765 /dev/nvidiactl
Xorg 1105 root 13u CHR 195,255 0t0 765 /dev/nvidiactl
Xorg 1105 root 22u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 23u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 24u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 29u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 30u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 33u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 34u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 35u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 44u CHR 195,254 0t0 774 /dev/nvidia-modeset
Xorg 1105 root 59u CHR 195,0 0t0 772 /dev/nvidia0
Xorg 1105 root 60u CHR 195,0 0t0 772 /dev/nvidia0
nvidia-se 84896 ndwar 6u CHR 195,255 0t0 765 /dev/nvidiactl
nvidia-se 84896 ndwar 7u CHR 195,0 0t0 772 /dev/nvidia0
nvidia-se 84896 ndwar 8u CHR 510,0 0t0 766 /dev/nvidia-uvm
nvidia-se 84896 ndwar 10u CHR 195,0 0t0 772 /dev/nvidia0
nvidia-se 84896 ndwar 11u CHR 195,0 0t0 772 /dev/nvidia0
如果我直接询问 nvidia 哪些进程正在使用该卡(这显然会短暂唤醒它):
> nvidia-smi pmon -c 1
# gpu pid type sm mem enc dec command
# Idx # C/G % % % % name
0 1105 G - - - - Xorg
我对这一切意味着什么感到有点困惑,因为我可以通过转到 中的“热设置”页面来强制 dGPU 保持开启状态nvidia-settings
。但是,上面的输出不会改变(例如 nvidia-smi 没有说nvidia-settings
是“使用”dGPU)。此外,Xorg 始终在运行,但 dGPU 会暂停,除非我打开另一个应用程序专门使用 dGPU。
系统信息
操作系统:arch Linux
lspci | grep -i nvidia
01:00.0 3D controller: NVIDIA Corporation GA107GLM [RTX A1000 6GB Laptop GPU] (rev a1)
> cat /proc/driver/nvidia/gpus/0000:01:00.0/power
Runtime D3 status: Enabled (fine-grained)
Video Memory: Off
GPU Hardware Support:
Video Memory Self Refresh: Supported
Video Memory Off: Supported
glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Mesa Intel(R) Graphics (RPL-P)
prime-run glxinfo | grep "OpenGL renderer"
OpenGL renderer string: NVIDIA RTX A1000 6GB Laptop GPU/PCIe/SSE2