Skip to content

采集启动、首点与停止延迟修复结果 ​

交付结论 ​

L1~L4 的无设备开发已完成,Foundation 升级为 collector-foundation.2.7-beta,Mac App 升级为 1.0.0 (38)。本批修复了已定位的三条工程阻塞路径:点击后先处理大缓存、普通指标被重型源饿死、停止收尾无统一短预算。

本结论为 E2 构建/合成压力证据,不把它描述为真机体验已经关门。Build 37 留存会话的 19.59 秒启动、0 sample、121.33 秒停止是修复前 E4 历史证据;Build 38 仍需用户在同类设备与应用上完成 E4 复测。

L1 · 启动快路径 ​

  • 两级预热完成后,点击路径只创建 Session、写入紧凑 loss/control 事实并立即发出唯一一次 launch;不再遍历、序列化或解码整个预热 CoreProfile ring。
  • 预热证据通过 _prepend_events 在 launch 后按源顺序承接。
  • 预热 ring 从单纯 64 chunks 改为 64 chunks + 32 MiB 双预算,live queue 为 512 chunks + 64 MiB 双预算。
  • 超出预算会累计 drop count/bytes,写入 core-profile.source-loss.raw,Session 标为 partial;不丢失后仍宣称 valid,不以 0 填缺值。
  • 300 MiB 合成 decoded-source 负载覆盖单次 launch、launch 先于 CoreProfile decode、端到端 click-to-launch ≤500 ms 合同。

L2 · 普通样本与重型处理隔离 ​

  • pymobiledevice3 仍是唯一设备 Provider/DTX owner;worker 只处理已到主机的 Raw,不新开设备 socket。
  • 每个普通 Adapter 一启动就创建 consumer,不再等待所有慢可选源完成。
  • 预启动 CoreProfile consumer 最后调度,每条 Raw 后显式让出事件循环。
  • JSON/base64 写盘由单线程有序 host writer 执行;全局 Session sequence 仍由 RawSessionRecorder 唯一分配。
  • CoreProfile Frame/Startup 解码离开 DTX/control event loop;Frame decoder 只更新独立的短锁状态,不并发修改普通 Metric Engine;sysmontap/lifecycle 可继续投影并发送 Wire sample。
  • JSONL 仍 append-only;flush 改为 16 MiB 或 250 ms 有界批次,finalize 时仍执行 flush、fsync、SHA-256 与严格 replay。

L3 · 停止链与 Startup 状态 ​

停止 UI/Wire 现在区分:

  1. stop_requested:停止指令已确认;
  2. capture_stopped:采样边界已关闭,UI 立即离开采集态;
  3. closeout_progress/stopping-sources:关闭设备源;
  4. closeout_progress/sealing-raw:封存 Raw;
  5. finalizer_progress:离线解析与报告阶段。

CoreProfile drain 上限 2 秒,所有 Adapter stop 共用 1 秒总预算,DTX owner close 1 秒,lease close 0.5 秒;Mac 端异常总兜底由 120 秒收紧为 10 秒,超时按 partial 收口。报告阶段不再持有设备源。

Startup 面板在最终九阶段报告尚未闭合时显示 采集中,封存后显示 解析中,最终没有可信结果时显示 缺失;继续保留 candidate/partial/missing,不把外部 observed-running 或 foreground-ready 冒充九阶段 Total。

L4 · 自动回归 ​

验证结果证据
Python Sidecar/Core233 / 233E2;冻结 Python 3.12 + pymobiledevice3 环境
Swift109 / 109E2;x86_64 macOS 测试目标
300 MiB 启动模型20 / 20E2;每轮断言唯一 launch、launch 先于 decode、click-to-launch ≤500 ms
30 MiB 重型源下普通首点20 / 20E2;每轮断言合法 sysmontap Raw→Wire ≤250 ms
启动模型完整测试进程 P95329.413 ms仅为进程+unittest 墙钟,不冒充产品 click-to-launch
首点模型完整测试进程 P95337.219 ms同上,不冒充 Raw→Wire 产品边界
Registry64 / 64公式与 metricID 未改变
Build 38 内部 ZIPx86_64;110,299,005 bytesSHA-256 d3255ee5039ae73c715393a3bf4ca293fcbfecf9954d19d5909aeb74230f6858;独立解包、严格 codesign 与 Core probe 通过

机器证据 使用 nearest-rank:排序后取第 ceil(0.95 × 20)=19 项。该文件不含设备、应用、账号或证书身份。

公式与质量语义 ​

本批没有改变任何业务指标数学公式、单位、scope、差分窗口或取整规则,因此 64 项 Canonical 公式版本不升级。变更的是采集管线质量语义:

  • prelaunchRingOverwriteCount > 0 或 prelaunchLiveQueueDropCount > 0 → CoreProfile Raw 质量为 partial;
  • droppedEventHighWater = max(source drop, bridge drop);
  • 丢失情况下 Startup/Frame 派生继续 fail-closed 为 partial/missing,不填 0;
  • 单 Adapter 保持源顺序,跨 Adapter 以 host monotonic timestamp 审计,不伪造全局设备时序。

Canonical 说明同步更新至深度 Raw 源的质量与发布语义。

仍开放的门禁 ​

  • Build 38 真机点击→launch、首个普通 sample、停止→设备释放需要 E4 复测;本轮未访问设备。
  • 真实 300~450 MB Raw 的完整 finalizer 墙钟尚未重新测量;10 秒故障兜底可能生成 partial,不能宣称报告性能已完全关门。
  • 商店 App 九阶段仍受 target attribution / RAW schema 门禁影响;管线变快不等于九阶段数值已具备。
  • iOS 26/27 仍是 E2 candidate;GPU Counter data row、ThermalStatus 稳定源、竞品同窗数值校准继续开放。
  • 本机无有效 Developer ID identity,notary keychain profile 也不可用;当前只能生成 ad-hoc 内部测试包。Gatekeeper / staple 未通过,不能称为公证正式包。
  • 对外分发仍受 universal2、GPL 法务、Developer ID 与公证凭据门禁约束。

下一阶段与整体进度 ​

下一阶段是 Build 38 的 E4 体验验收:同一设备/应用至少各跑 Startup 开/关 3 轮,记录点击→launch、合法普通样本→Wire、首样本、停止采样反馈、设备释放、最终报告与 Startup quality。若仍慢,按 Wire 阶段时间戳定位到设备调用、writer、decoder 或 finalizer,不再用整体体感猜原因。

整体上,64 项 Registry 与 iOS 15~18/26/27 E2 合同保持;P4 的离线工程修复完成,真机体验门禁仍开放。P2 Startup 九阶段、P3 长窗口/PID 归因、P5 Thermal/物理放电、P6 GPU data row、P7 Cloud/正式发布尚未全部关门。

Perfowl · Performance Observer