@unieai/uad-machine-metrics
v0.1.21
Published
What a machine is doing right now: processor, memory, disk, and accelerators
Readme
@unieai/uad-machine-metrics
English | 中文
一个 session 所跑的那台机器此刻在做什么:处理器、内存、磁盘,以及各家厂商工具愿意报告的加速器。
一个服务,一个方法
ctx.machineMetrics.sample(signal) 透过 ctx.subprocess 跑一条 shell 命令,再解析拿回来的东西。这里不推送、不轮询,一次调用之后除了「算百分比所需的那一份读数」什么都不留。
走 ctx.subprocess,而不是走 Node。 os.cpus() 与 /proc 读的是调用它们的那个进程,也就是永远是这台电脑。一个人把 session 指向一台 GPU 主机、却盯着自己笔电的仪表,读到的是一个和真话长得一模一样的谎。subprocess 这道缝正是 execution-router 已经对准了「他挑的那台机器」的那一道,所以远端读数与本机读数是同一条代码路径,而本套件从头到尾不需要知道「机器」这回事。
一条命令,而不是五条。 每一次读取都是一趟往返;如果处理器、内存、磁盘与加速器分开问,一台 30 ms 链路上的机器每轮要花掉四分之一秒。这条命令把每一段都放在 @dsh: 标记后面输出,由解析器切开。
每一段都有保护。 一台没有 /proc、没有 nvidia-smi、也没有 npu-smi 的机器跑的是同一条命令,只是那几段输出为空。所以这条命令在一个裸容器上和在一台 GPU 主机上都以 0 结束,而传到调用端的失败讲的是连线,而不是缺了某个工具。
没量到的就是没有
每一个字段都是可选的,读不到的那个回来是 undefined——绝不是 0。给一个没人量过的读数画一条 0% 的仪表,是一个会让人照着做决定的谎:它说这台机器闲着,而这跟「没量」是两回事。
这条规则决定了好几个细节:
- 一台机器的第一次采样不报处理器百分比。
/proc/stat是累计值,所以百分比是两次读数之差。服务保留上一次再相减,这正是top的做法;另一条路是让命令在机器上睡一秒,每一轮都睡,把连线开着什么也不做。 - 计数器没有前进、或者倒退了,就什么都不报,而不是除以零或报出负数——两次轮询落在同一个时钟节拍里,以及两次轮询之间机器重开机了。
- world 换掉了,差值就作废。 拿一台机器的计数器去减另一台的,会得出一个数字,而那个数字没有意义;所以路由移动之后的读数从头开始。
- 内存读的是
MemAvailable而不是MemFree。 空闲内存不含页面快取,所以一台健康的 Linux 机器只剩个位数,用它做出来的仪表读起来永远是满的。
可携性,以及它到哪里为止
df -Pk 是 GNU 与 BSD 唯一有共识的 df 形式。Mach 那条路(hw.memsize 加 vm_stat)涵盖 macOS 的内存;macOS 的处理器百分比则根本不读,因为要问它就得让 top 把每个进程完整采样一次,所以一台 Mac 报的是核心数与负载平均,没有百分比。
GPU 读的是 nvidia-smi 的 CSV。NPU 没有对应的东西,所以这里读的是实际会被人接上的那两种形式——Ascend 的 npu-smi info 表格,以及 Rockchip 的 /sys/kernel/debug/rknpu/load——其余一律报告「没有 NPU」,而这也正是一台真的没有 NPU 的机器给出的答案。
Model Experience
无,因为此套件不注册任何 tool、prompt、schema 或 context:它回答的是一条给人看的界面用的宿主路由,任何读数都不会进到模型请求里。
KV Cache effect
无。这里不贡献任何 prompt 片段、工具定义或 context 条目。
Known Limitations and Deferred Work
- Mac 不报处理器百分比。 Mach 那条路没有一个这条命令能便宜读到的累计计数器;
top -l 2会把每个进程采样两次、要花一秒才回答。Mac 的核心数与负载平均照读,界面上就是少画一条。 - 只读 NVIDIA 的 GPU。 AMD(
rocm-smi)、Intel(xpu-smi)与 Apple 自家 GPU 各有各的工具与输出;要加就是一段命令加一个解析器,之所以没有,是因为还没有人拿那些硬件跑过这套东西。 - NPU 只涵盖两家,而且都是靠比对文字。 这里认得的是 Ascend 的表格与 Rockchip 的 debugfs 行。厂商改一个栏位名,结果会变成「没有 NPU」而不是一个错的数字——这是刻意选的失败方式,但它仍然是一个没有人被告知的失败。
- 读数没有历史。 每次采样讲的是此刻;想画趋势线的界面得自己留,这里除了算差值所需的那一份处理器读数之外什么都不保存。
- 磁盘只有一个文件系统。 就是设定的那个路径所在的那一个——预设是 harness 自己的工作目录。工作横跨好几个挂载点的机器,报的是被问到的那一个,而界面没有办法问另一个。
