知识卡片
百分位点比均值更能反映用户真实体验及尾部延迟放大
内容
衡量[[响应时间与延迟是两个不同的概念]]时,报表常用的”平均响应时间”其实是一个很差的 指标:算术平均值会被少数极端慢请求拉高或拉低,无法回答”典型用户实际等了多久”这个 问题。更好的方式是用百分位点:把所有响应时间从快到慢排序,中位数(第50百分位点, p50)左边一半的请求比它快、右边一半比它慢,直接告诉你”一半用户经历的延迟不超过这个 数”;更高的百分位点(p95/p99/p999)则用来衡量异常值有多糟——p99意味着100个请求里 有99个比这个阈值快,只有1个更慢,这类”尾部延迟”值得关注的原因是:请求最慢的客户往往 数据量也最大,可能恰恰是最有价值的客户。百分位点还揭示了一个复合系统里的放大效应—— “尾部延迟放大”:当处理一个最终用户请求需要并行调用多个后端服务时,只要其中任意一个 后端调用命中了它自己的尾部延迟,整个用户请求就会变慢;后端调用数量越多,用户请求 “撞上至少一次慢调用”的概率就越高,因此复合系统的末端尾部延迟往往比任何单个后端自身 的尾部延迟更严重。另外队头阻塞(head-of-line blocking)也是高百分位点的常见成因: 服务器只能并行处理有限数量的请求,少数慢请求会挡住排在它们后面的请求,即使这些后续 请求本身处理很快,客户端看到的总响应时间依然会被拖慢,因此在压测时必须让产生负载的 客户端独立于响应时间持续发请求,否则等待前一个请求完成再发下一个会人为压缩测得的 队列长度、扭曲测量结果。
结构图:
flowchart LR
A[平均响应时间: 被极端值扭曲, 不反映典型体验] -.替代.-> B[百分位点]
B --> B1[p50中位数: 一半用户经历的延迟上限]
B --> B2[p95/p99/p999: 衡量尾部异常值]
C[单个后端慢请求] --> D[队头阻塞: 拖慢排在后面的请求]
E[一个用户请求需并行调用多个后端] --> F[任一后端命中尾部延迟即拖慢整体]
F --> G[尾部延迟放大: 后端调用越多, 命中慢请求概率越高]
参考来源
- 位置:《数据密集型应用系统设计》第一章《可靠性、可伸缩性、可维护性》"延迟和响应
时间""实践中的百分位点"(源文件:_epub-src/ch1_split_004.html)
- 结论依据:原文说明平均值不能反映典型场景延迟,中位数/p95/p99等百分位点是更好
的衡量方式,尾部延迟因数据量大的高价值客户而值得关注,并详述多重后端调用下的
尾部延迟放大效应和队头阻塞导致排队延迟的机制,直接支撑本卡片结构梳理。
- 原始内容:如果想知道典型场景下用户需要等待多长时间,那么中位数是一个好的度量
标准……响应时间的高百分位点(也称为尾部延迟)非常重要,因为它们直接影响用户的
服务体验……即使并行调用,最终用户请求仍然需要等待最慢的并行调用完成……这种效果
称为尾部延迟放大……这种效应有时被称为头部阻塞。