R8-Fix-5:Pmd3 Pump 公平调度与有界关闭修复方案
根因
Build 66 真机显示 ActivityTrace source presentation 连续,但 host receive 出现 52 次 >1s 空洞、最大 5.24s;1s Sample Publisher P50 退化到 2.59s。独立最小复现进一步证明 Pmd3Subscription._pump() 在 fast upstream 下可以在 consumer 首次调度前先 delivered 完 576 条,且 200000 条 burst 可连续占用 event loop 约 411ms,因此主因收敛为 pump/filter 缺少调度公平性。
修复主线
Pmd3Subscription._pump():32 条或 1ms 的 bounded burst,达到任一门槛后await asyncio.sleep(0)。- ActivityTrace filtered stream:64 条或 1ms 的 bounded filter burst,避免 unmatched flood 独占 event loop。
- 增加 pump/filter/event-loop heartbeat 诊断并写入 manifest/census/stopped。
- Stop 改用 8 秒 collector absolute soft deadline;各阶段按 remaining budget 剪裁,Swift Core 10 秒 fault budget 不扩大。
- 实时 stream 缺 live report seal 时不进入重型 historical replay,按 partial + terminal stopped 退出。
禁止项
不得修改 FPS/FrameTime/P95/Jitter/Refresh Rate 公式,不得回退 Source Owner,不得扩大 queue 或延长产品超时掩盖问题,不得补 0/60/16.67,不得 per-event sleep(0)。
E2 核心门禁
576 fast-upstream: consumer 必须在 producer delivered 完 576 前执行 pumpMaxBurstCount <= 32 200000 burst throughput >= 20k events/s 120Hz mixed: heartbeat P95 gap <150ms, Max <500ms 1s sample publisher: P95 <=1.25s, Max <=2.0s normal Stop: terminal stopped 在 collector soft deadline 内 timeout path: partial + 精确 reason + terminal stopped
Build 67 E4
consumed/delivered >=99% undrainedAtClose <=1 dropped=0 host gap >1s =0 host gap P95 <250ms / Max <500ms heartbeat P95 <200ms / Max <500ms FPS/FrameTime/P95/Jitter/Refresh valid ratio >=95% final stopped <=8s target Session complete ingressUndrainedAtSeal=0 no graceful_stop_timeout
完整实现细节、T1-T14 测试与一键任务描述见站点 devlog Canonical 文档。