做跨平台硬件监控做到深水区,最难啃的往往是操作系统底层那些没有统一标准接口的指标。到了 2026 年 10 月中旬,观澜的看板已经很完善了,但还有两件让我一直耿耿于怀的事:一是看到整张显卡占用率飙高时,进程列表里却看不出是哪个进程干的;二是 macOS 上的探针一直像个“Linux 阉割版”,连大小核频率和芯片功耗都读不全。

10 月 15 日到 18 日(v3.0.158 Commit ff8e4ae 与 PR #70 v3.0.159 Commit d9c2df6),我集中精力把这两块硬骨头给啃了下来。

三大平台单进程 GPU 占用率(gpuPercent)

要在实时进程列表里算出每个进程的 gpuPercent,三个桌面系统完全是三套路数:

  • Windows:我接入了 PDH 的 \GPU Engine(*) 性能计数器,按 PID 归并各个 3D、Compute、Copy 引擎的时间片;
  • Linux:直接遍历 /proc/<pid>/fdinfo/*,解析内核 DRM 驱动暴露的 drm-engine-* 纳秒级累计耗时做两次采样差分,再配上 NVIDIA NVML 接口做兜底;
  • macOS:通过 IOAccelerator 注册表读取每个客户端进程的累计 GPU 时间做差分。

汇总时,采集器会取该进程当前最忙引擎的真实占用百分比;如果遇到权限受限或驱动不支持采不到数据,就老老实实返回 null,界面显示横杠,绝不拿假的 0% 糊弄人。

macOS 原生硬件采集彻底告别“阉割版”

以前很多跨平台工具在 Mac 上只会调几个通用 POSIX 接口,读出来的数据惨不忍睹。这次我直接用原生代码桥接了 macOS 底层的 Mach/sysctl、IOKit、AppleSMC 和 IOReport:

  • 自动识别 Apple Silicon 的 P-core(性能核)与 E-core(能效核) 集群拓扑,利用驻留时间算出真实的加权运行频率;
  • 经由 AppleSMC 直接读取风扇实际转速与各传感器温度;
  • 正确解析 APFS 容器(Container) 的共享空间挂载点与 NVMe SMART 寿命;
  • 通过 IOReport 实时读出 CPU、GPU、ANE(神经网络引擎)、DRAM 的实时瓦数功率,连同 macOS 系统热压力等级(Thermal Pressure)一起展示在详情页里。