结论先行:判断新版本有没有把性能做坏,不能拿发布前后的整体平均响应时间直接比。可行做法是固定四类指标(分位耗时、错误率、慢调用占比、下游依赖耗时),把对比窗口切成"发布前基准段"与"发布后观察段"两个等长区间,并先剔除流量结构、时段批次、缓存预热三类干扰,再下结论。灰度环境同时跑新旧版本时,把两个版本的同一接口指标放在一张图里比,比拿历史数据比更可靠。
为什么均值看不出回归
平均值会把两类变化同时抹平。一类是少数请求被拖慢:新版本引入了一处未命中缓存的查询,受影响的是 3% 的请求,耗时从 80 毫秒涨到 3 秒,但整体均值只从 120 毫秒变成 205 毫秒,看上去"略有上升"。另一类是流量结构变化:发布当天刚好赶上营销活动,慢的后台查询类请求占比提高,均值上升却与新版本无关。
分位耗时对前一类敏感,流量结构归一化对后一类有效。两件事都要做,缺一件都可能得出相反结论。
四类要盯的指标
| 指标 | 看什么 | 回归信号 | 常见误判 |
|---|---|---|---|
| 分位耗时(P95、P99) | 同一接口在新旧版本的分布差异 | P99 涨幅超过 P50 涨幅 | 只看 P50,尾部劣化被隐藏 |
| 错误率 | 5xx 与业务失败码占比 | 错误率抬升且集中在特定接口 | 把重试掩盖后的最终成功算成正常 |
| 慢调用占比 | 超过约定阈值的请求比例 | 占比翻倍但单点数值仍不高 | 只统计慢调用条数,忽略总量变化 |
| 下游依赖耗时 | 数据库、缓存、外部接口的耗时分段 | 应用耗时持平而依赖耗时上升 | 把外部渠道抖动算到新版本头上 |
对比窗口怎么取
| 场景 | 基准段 | 观察段 | 说明 |
|---|---|---|---|
| 全量发布 | 发布前同一周的同星期、同时段 | 发布后 24 至 72 小时 | 避开周一高峰与月末结算日 |
| 灰度发布 | 灰度组中新版本的流量 | 同一时段基线组的流量 | 两组流量同源同时段,可比性较高 |
| 分批发布 | 未升级批次的指标 | 已升级批次的指标 | 批次间业务构成要接近 |
观察段不宜短于一个完整业务周期。只发版后看两小时,很容易把缓存未预热、连接池未填满的冷启动阶段误判为性能回归。
三个干扰因素要先排除
- 流量结构。按渠道、接口、用户群体分组后再比。整体上升但每个分组都没变,说明是流量构成问题,不是版本问题。
- 时段与批次。把对比窗口对齐到同一时段。跨了批处理窗口或结算窗口的数据,本身就不具备可比性。
- 缓存与预热。发布后前 30 分钟的连接池、本地缓存、即时编译都处在构建期。这段数据单独标记,不进对比结论。
灰度阶段的对比步骤
- 先确认链路标识在新旧版本都能正常透传,透传断了对比就没有配对样本。
- 把版本标识写进检索索引,让"某个接口的 P99"可以按版本拆分。
- 为这次发布单独开一个取证窗口,把采样率临时提高,避免慢请求被采样丢弃。
- 灰度比例按 5%、20%、50% 递进,每一档至少观察一个完整业务高峰。
- 发现回归立刻定位到具体环节:先看分位耗时在哪一段涨,再下钻到语句、外部调用或线程。
落地清单
- 发布前先固化基准数据,而不是发布后再找历史。
- 把版本字段纳入指标维度,发布对比做成看板而不是临时查询。
- 为每次发布配置独立的采样与告警策略,观察期结束后再回落。
- 把"性能回归判定标准"写成可勾选的清单,明确谁有权决定回滚。
- 发布后 24 小时内出一份对比结论,无论是否有回归,都归档留痕。
奇摩在为金融与制造企业做可观测体系建设时,通常把发布对比模板与告警分级一起交付,让版本观察有固定动作可以走。如果您正在搭建发布性能回归的对比机制,欢迎预约咨询,我们可以结合现有链路数据给出可落地的指标口径。
