这类问题我又碰上了一次。在链路里注入 100ms 延迟做演练,结果大量请求直接超时,客户端读超时设的正好是 100ms,而服务端 P99 基线本来就有 95ms。

第一反应是「重试把延迟叠加成三倍」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。注入值贴着客户端超时线,没有余量;客户端超时不包含排队时间;注入点放在链路最深处,前面的耗时没算进去。

量清楚基线延迟分布

python p99.py --metric latency --window 1h --quantiles 0.5,0.95,0.99

随后按基线两成分档注入

python chaos.py --target api --latency 20ms,50ms,100ms --duration 5m

同时观察超时率和重试次数

python watch.py --metrics timeout_ratio,retry_total --interval 15s

等前面都确认过,再按档位回滚确认恢复

python chaos.py --target api --revert

改完先别撤,确认这几项。每档注入下超时率可控,延迟到 100ms 时超时率上升但可解释,回滚后五分钟恢复到基线。

演练注入要从基线的一小部分开始,直接打到超时线只会得到一片红色,什么也验证不出来。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189