外观
APP CPU
APP CPU 指目标进程的 CPU 利用率,来源于 iOS 开发服务的 sysmontap 进程表,只统计被绑定目标进程自身的 CPU 时间占比。
指标标识
| 项 | 值 |
|---|---|
| metricID | ios.process.cpu.non_normalized |
| 显示名 | APPCpu |
| scope | process(目标进程) |
| unit | percent |
| 底层系统服务 | com.apple.instruments.server.services.sysmontap (DTX 传输通道) |
| 采集命令/实现 | pymobiledevice3.services.dvt.instruments.sysmontap.Sysmontap.create(provider, interval=500) |
| 来源字段 | ProcessesAttributes 映射之 Processes[target_pid].cpuUsage |
| 归一化 | raw-dvt-process-gauge;多核累加原始口径 |
| 当前可用性 | available · Experimental |
底层采集与计算公式
- 计算方式:Sysmontap 以 500ms 间隔向客户端推送进程表快照。Perfowl 在
metric_engine.py中通过target_pid定位到目标进程属性向量,直接读取cpuUsage: $$\text{APPCpu} = \text{Processes}[\text{target_pid}].\text{cpuUsage}$$ - 多核累加特性:该值为传统多核未归一化口径。例如在 6 核设备上,若目标进程占满 1 个核心,其值为 100%;若多线程满载 2 个核心,其值为 200%。Perfowl 在采集基座中保持原始 raw 物理真值,不强行按总核心数压缩到 100% 以免失真。
目标身份如何保证
APP CPU 的可信度完全取决于"绑对了进程"。Perfowl 通过三重校验:
- Mac 端显式传递所选 Bundle ID(不只传 executable 名);
- Collector 通过 Bundle ID 只读解析 PID,再用进程表的 bundleIdentifier 二次核对;
- 目标重启时重新解析;身份不一致时 fail-closed(输出空值 + 原因),绝不回退到"第一个同名进程"。
历史上曾因同名 executable 误绑导致 162 个样本 CPU 全 0,此事故的完整复盘见开发记录(2026-09-03 · 0 值正确性复核)。
质量语义
valid:身份 verified 且数值来自真实进程表;suspect-static:CPU 与多个累计 counter 连续 10 个样本完全不变时标记,提示绑定可能异常或进程确实静止;missing:身份不一致或进程表无该进程——显示空值,不写 0。
当前校准状态
Experimental。 iOS 上该值为传统未归一化进程口径(官方 PerfDog 资料同样标注 iOS 为传统 CPU),与 Xcode / PerfDog 的同场误差对照尚未完成,见开发记录 · B-VAL 门禁。
版本历史
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.1 | 2026-09-06 | 补全底层服务标识符、PMD3 采集调用命令与精确计算公式规范 |
| v1 | 2026-09-04 | 首次发布;依据 Metric Registry 与 0 值复核后的身份校验语义 |
来源批次:Batch A 实施结果 · 0 值复核