外观
Build51 启动归因保留与主动排空
根因与实施
Build50 已解决“已闭合阶段等待 Total/stop”,但停止前 Total 为 16/20。第一层根因是 v6 快路径在任意目标线程归因成功后停止扫描后续 PERF_THD_Data;Initial Frame BEGIN 线程可能在事件前仅 0.1~0.3 ms 才首次绑定目标 PID。core-profile-app-lifecycle.candidate.v7 因此持续扫描三类已冻结 PID/TID 归因记录,并且每个目标线程只保留第一条精确映射,重复 kperf 样本直接短路。
第二层根因是真机 CoreProfile 会把后半段 lifecycle chunk 缓冲到用户 stop。Build51 在同一 DTX owner 下串行执行:启动 tap → 启动后 2.25 s 主动 stop/drain → frame-only tap 续接。任何时刻最多一个 tap 持有 kperf;启动 drain chunk 仍实时解码并按 revision 发布,普通 sysmontap/graphics/network 等任务不停止。源切换窗口以 rotationGapMs 和 partial-rotation-gap 明示,不伪装为连续帧源。
公式、复杂度与有界等待
Canonical 已先行入档 v7 目标线程集合、启动主动排空和续接公式。lifecycle DebugID、Total 首尾端点、5 ms reorder、单位和 missing 语义均未改变。
- 扫描
O(N);增量内存O(U_target + K),每个目标线程只保留首条映射; - flush 触发:
t_launch + 2.25 s,主机静默 750 ms 视为 quiescent,drain 最大 4 s; - frame-only restart 最大 5 s;一个有界 writer、一个 worker hop,不新增无界队列;
- 用户 stop 与 rotation 竞态时,
capture_closing阻止新 tap,由全局 stop 路径唯一收口。
E2 Raw 回放与资源
五份真机 Raw(2.13M~2.94M records)同时运行 v7 fast 与 exhaustive 对照,5/5 的 Total、阶段值、spanCount 和 quality 逐项一致;四份源本身具有 Total 的样本,fast 4/4 均得到 liveComplete=true,历史真缺失样本仍保持 missing。
| 项目 | v7 fast | exhaustive |
|---|---|---|
| 单会话 wall | 1.449~2.074 s | 9.242~12.745 s |
| chunk P95 最大值 | 195.976 ms | — |
| chunk Max 最大值 | 221.222 ms | — |
五会话、两套 decoder 同进程的对照容器峰值 RSS 为 1,886,822,400 bytes、peak footprint 1,720,606,720 bytes;这是同时保留完整 events 和 exhaustive records 的基准上界,不代表产品单 decoder 常驻值。E4 15 s 会话 CoreProfile Raw P50 161.448 MiB、P95 190.957 MiB;全源 droppedEventHighWater 最大 118,说明资源/队列门禁未关闭。
E4 真机 20 轮
设备 A / 目标 App A、最终 x86_64 二进制、每轮 15 s 采集:
- stop 前首个阶段 revision:20/20;revision 后常规 sample:20/20;
- stop 前 Total / Initial Frame:19/20(95%),达到覆盖率目标;源本身缺失的 1 轮继续 missing;
- 首次 revision P50 1690.685 ms、P95 1879.858 ms;
- Total Wire 相对 launch P50 4771.236 ms、P95 5342.684 ms;Total 所在 chunk→Wire P50 86.126 ms、P95 268.276 ms;
- frame-only 源在 stop 前恢复:20/20;rotation gap P50 5152.740 ms、P95 5292.041 ms;restart→首 frame chunk P50 1239.140 ms、P95 1303.487 ms;
liveQueueDropCount=0:20/20;但 6/20 startup drain 触及 timeout,且全源 drop high-water 最大 118;- System Interface / Static Runtime 20/20,Initial Frame 19/20;条件回调阶段未观察到时继续 missing。
结论与开放门禁
Build51 把停止前 Total 从 Build50 的 16/20 提升到 19/20,并保持 revision 后普通性能样本 20/20;目标线程晚归因问题已修复,主动 drain 能在用户 stop 前发布 Total。
整体仍为 partial:Total 首次 Wire P95 仍为 5.343 s,未达到 ≤1 s 的即时性目标;CoreProfile rotation gap P95 5.292 s;6 次 drain timeout 和全源队列 drop 仍需收敛。下一阶段应从设备端 chunk 体积/交付节奏和 frame tap 稀疏缓冲入手,不扩大未验证 DebugID,也不把缺失补 0。
Python 304/304 通过;Swift 130 项中 127 通过、3 项显式资源 benchmark 默认跳过。Build51 内部测试包已使用 Developer ID Application + hardened runtime 签名,严格签名、独立解包、独立启动和 SHA-256 通过;本机缺 Notary Service profile,所以未 notarize/staple,Gatekeeper 仍为 unnotarized。GPL-3.0 法务门禁继续独立开放,本包仅用于内部测试。