鉴于 Linux 中的一切都是文件,进程不会神奇地从任何地方获取信息。如果您在没有 sudo 的情况下看到信息,则意味着某处有一个文件系统文件系统,进程, 或者开发文件系统可以作为用户访问。否则,它也可能只是来自内核 ABI(系统调用)而不是文件,其中信息也可以从诸如读写控制()和插座()如果不是其他直接系统调用,例如获取CPU()。
因此,考虑到这一点,我正在寻找 nvidia-smi 读取的源文件以获取其信息
事实上,我想比 Nvidia 单独扩展这一点,因为 nouveau、radeontop、AMDGPU 以及英特尔使用的任何东西,也有类似的方式来获取这些由于某种原因而未透露的信息......
这些进程从哪些文件获取信息?
我的最终目标是阅读这些文件康基并为系统中的每个 GPU 每秒显示 16 次图表,就像我为系统 CPU 和 RAM 使用情况所做的那样。
答案1
您可以通过一个命令自己找到这一点。
strace -o results.txt -e trace=openat nvidia-smi
将运行nvidia-smi
并创建它打开的每个文件的列表results.txt
。
你会发现它使用的libnvidia-ml.so.1
是NVIDIA 管理库。加载该库后,nvidia-smi
打开如下文件:
/dev/nvidia0
/dev/nvidia-caps/nvidia-cap2
/dev/nvidiactl
/dev/nvidia-uvm
你会发现这些设备节点不会产生任何有用的监控信息供直接读取;毫无疑问,图书馆正在ioctl(2)
对这些设备进行特定的系统调用以获取所需的信息。 (您可以通过 确认这一点strace -o results2.txt -e trace=openat,ioctl nvidia-smi
。)
如果您希望进行一些编程来获取所需的信息,您可能应该阅读NVML API 参考指南并使用该libnvidia-ml.so.1
库,而不是尝试ioctl()
在您自己的代码中进行原始调用。您可能会在第 2.14 章中找到几乎所有您想要实时监控的内容,设备查询。
但是,有些文件看起来可以直接读取:
/proc/driver/nvidia/capabilities/mig/config
/proc/driver/nvidia/capabilities/mig/monitor
/proc/driver/nvidia/params
这给了我们希望/proc/driver/nvidia/
,它的子目录可能值得研究;唉,里面没有太多值得实时监控的东西。
所以,不幸的是,它看起来不像用 Conky 读取一些文件那么容易;如果您不愿意进行一些编程,我是否建议您从处理输出开始
nvidia-smi -q -d MEMORY,UTILIZATION,TEMPERATURE,VOLTAGE,POWER
或者类似的命令?
我认为以每秒 16 次的周期运行这种监控是一种愚蠢的矫枉过正,除非您正在排除特定问题。