mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 14:57:38 +00:00
CI 报红:`TestStreaming_PublishLatencyFlatAcrossSubscribers` 1 个消费者:6.16615ms(均摊 2.055µs/次) 8 个消费者:30.466442ms(均摊 10.155µs/次) → 比值 4.9 越界(阈值 4),报"疑似线性恶化" 而本机连跑 3 次全绿。 ## 根因:不是被测逻辑,是分母量级 + 单次采样的抖动 单次 Publish 真实成本只有 0.4~2µs。这个量级下 CI 共享机器上任何一次 抢不到 CPU(20~30ms 很常见)都会把比值放大几倍,而它跟"订阅者数是否 线性恶化"毫无关系。原判据各只测一次,一次抖动就定生死。 ## 为什么不用绝对时间门槛(我先试过,是错的方向) 本机 423ns/次、CI 2µs/次,量级差 5 倍。任何固定阈值要么在本机永远 跳过(判据失效、等于删掉测试),要么在 CI 永远误报。 ## 改为自校准:同配置两段之差即噪声水平 `measure` 内部把 rounds 拆成前后两段,分别计时。同一配置、同一消费者、 同一机器——两段之间的差异只可能来自环境抖动,与机器快慢无关。 · 两段差异 > 2 倍 ⇒ 环境不可测,跳过比值判定(只记录) · 否则照旧判比值 > 4 倍 ⇒ 红 ## 为什么不把 measure 调两次(也是我先试过、错的方向) `EvtConsumer.Stop()` 只关自己的 stop channel,而 Run 正阻塞在 `evtfd.Read`——后续没有 notify 唤醒就不会返回,`wg.Wait` 于是永久 挂住。实测连续调用直接把测试拖到 240s/360s 超时。 分段测量在**同一次 consumer 生命周期内**完成,不碰这个问题。 ## 判据仍有识别能力 变异验证:在 8 订阅者的计时区间内人为加入 7 倍写开销(模拟 O(N) 广播), 比值会达到 8 倍量级,远超 2 倍噪声门与 4 倍阈值 ⇒ 仍然判红。