← 关联知识节点:可观测性:Trace、Replay 与成本追踪
交互工具 · 算账

p95 告警线与长尾分布

「告警线设在 p95 之外而不是平均值上,平均值会被长尾淹没」——这句纪律拆成两笔可拧的账:线设在哪(越线占比 × 日调用量 = 值班账,均值看着合理实则比 p90 还松),线怎么测准(先观测后定线:小样本下 p95 的估计就是「第 19 大」,拿偶然当基线)。拖一条线,亲眼看长尾怎么淹没均值。

纯前端真公式:对数正态 = exp(μ + σ·z)(Box-Muller 标准正态,中位数锚定 2000 ms、σ 拧长尾强度);分位数用最近秩定义(sorted[⌈q·n⌉−1]),与文章「从小到大排,95% 位置的那个值」同口径;每天 1 万次调用为换算演示锚点(页面明示,代入自家数字只换系数);seed=42 完全可复现,零 API、零延迟。

Agent 的延迟天生右偏长尾:大多数请求很快,少数慢得离谱。 告警线画在哪,决定它天天响还是真抓异常—— 拖动阈值线,看越线占比怎么从「三成流量飘红」收到「最慢的 5%」。

延迟分布(2000 个请求)

线内(正常) 越线(告警)
平均值 2703 ms

横轴 0 → p99(14.0 s);p99 之外还有 20 个请求未画出(最慢 25.4 s)——直方图截尾如实记账。

seed=42 · 可复现
越线占比
34.4%
严格大于告警线
折算每天告警
3,440
按每天 1 万次调用
分位对照
均值 2703 ms
p90 5349 ms
p95 7175 ms · p99 14.0 s

平均值被长尾抬到 2703 ms(中位数才 1970 ms),跟着它定线,34% 的请求天天越线 = 每天 3440 条告警——值班的人三天就麻了,这正是「告警天天响但没人点开看」的成因。 换算口径:每天 1 万次调用 × 越线占比;长尾强度 σ=0.80 下均值 2703 ms、p95 7175 ms、p99 14.0 s。

第二笔账 · 线怎么测准:p95 估计的小样本退化

「先观测后定线」要的是多少样本
真值 7474 ms

24 个独立观测窗(每窗 n=20 个请求)各自估 p95:估计落在 3586 ms – 11.2 s, 最大偏离 ±50%。n≤50 时估计乱跳且系统性偏高——每窗 20 个样本里「第 19 大」就是它,p95 实际退化成近似最大值:拿这种窗定线,等于把偶然当基线。

和文章口径的关系

「告警线设在 p95 之外而不是平均值上,平均值会被长尾淹没」——本页把它拆成两笔可拧的账:线设在哪(越线占比 × 日调用量 = 值班账)与线怎么测准(小样本 p95 估计的退化)。

延迟分布用对数正态(中位数 2 s 锚定,σ 拧长尾),分位数用最近秩定义—— 与文章「从小到大排,95% 位置的那个值」同口径;Box-Muller + 固定种子,同参数完全可复现。 长度与调用量(1 万次/天)为演示口径,代入自家数字时只换系数、不换账法。零 API。