对抗知识焦虑,从看懂这条开始
App 下载对抗知识焦虑,从看懂这条开始
App 下载
延迟测量方法|性能工程|Azul Systems|Gil Tene|系统延迟监控|软件工程|前沿科技
当一位用户在支付页面点击“确认”后,屏幕冻结了整整5秒,最终放弃了购买。而在公司的监控中心,一块巨大的屏幕上,代表服务健康的延迟曲线平滑如镜,95%分位点的延迟指标显示一片绿色。用户怒不可遏,数据却说“一切安好”。这并非科幻,而是正在无数系统中上演的“延迟的谎言”。我们习以为常的测量方法,可能从一开始就错了。
长期以来,工程师们习惯用平均值、中位数来衡量系统延迟。然而,Azul Systems的首席技术官Gil Tene,一位在性能工程领域深耕多年的专家,向这一传统发起了挑战。在他广为流传的演讲《如何“不”测量延迟》中,他一针见血地指出:“你用来测量和推理延迟的工具和方法,很可能存在严重缺陷,甚至是在当面欺骗你。”
延迟的真相是什么?它并非一个单一的数字,而是每次独立操作耗时的完整分布。一百万次请求,就有一百万个延迟数据点。这些数据点构成的分布曲线,几乎从不遵循平滑的正态分布。相反,它充满了尖峰和长尾,形态诡异,这源于系统中无处不在的“暂停”(Hiccups)。
这些“暂停”可能来自任何地方:Java虚拟机的垃圾回收(GC)暂停、操作系统的上下文切换、虚拟机管理程序的冻结、数据库索引重建……它们就像系统运行中的微小“心脏骤停”,虽然短暂,却能造成灾难性的延迟。而平均值和中位数,恰恰会像温和的滤镜一样,将这些最糟糕的体验瞬间抹平,呈现出一派虚假的繁荣。
“既然平均值不可靠,那我们看分位点总行了吧?” 许多团队自豪地将95%或99%分位点(P95, P99)作为核心服务等级目标(SLO)。但这恰恰是另一个美丽的陷阱。
Gil Tene将其称为“营销系统”——一种只展示美好、隐藏丑陋的数字游戏。他通过一个简单的数学推演揭示了惊人的事实:假设一个典型的用户会话包含5次页面加载,每次加载40个资源。在这种情况下,一个用户能体验到所有请求都优于P95延迟的概率,仅有0.003%。这意味着,99.997%的用户,都将遭遇到比你监控面板上那个漂亮的P95数字更糟糕的体验。
更令人震惊的是,P99也并非什么“罕见”的极端情况。数据显示,对于多数网页,单次访问就有超过50%的概率会遇到至少一次P99级别的延迟。P99不是边缘,而是大部分用户的日常。我们痴迷于优化所谓的“普遍情况”,却不知不觉地忽略了绝大多数用户的真实感受。
如果说对分位点的误解是认知上的偏差,那么一个名为“协同遗漏”(Coordinated Omission)的现象,则是工具层面最致命的缺陷。这几乎是所有基准测试和负载生成工具的原罪,一场我们所有人都在参与的“无声合谋”。
想象一个负载测试工具,它被设定为每秒发送100个请求。当系统健康时,它忠实地记录下每个请求1毫秒的响应时间。但突然,系统因为一次GC暂停,冻结了100秒。在这100秒里,工具本应发出10000个请求,但由于系统无法响应,它只能发出1个,并耐心等待其在100秒后返回。当系统恢复后,它继续发送请求,记录下那些1毫秒的“好”数据。
最终的测试报告会告诉你什么?它会告诉你,系统的平均延迟是10.9毫秒,P99.99延迟是1毫秒。它会告诉你,这个系统“已为生产就绪”。但真实情况是:系统的平均延迟高达25秒,最大延迟是100秒!
工具通过在系统最糟糕的时候“退缩”,选择性地忽略了最坏的数据,从而粉饰太平。 它测量的不是用户真正感受到的“响应时间”(包含排队等待),而是系统空闲时的“服务时间”。
更可怕的是,基于这种被污染的数据做决策,可能会导致“越优化越糟糕”的悖论。如果我们做了一项改进,消除了100秒的暂停,但让所有请求的延迟都变成了5毫秒。有缺陷的工具会报告说,P99.99延迟从1毫秒恶化到了5毫秒,性能下降了5倍!这个“数据”会驱使你撤销一个正确的优化。
如何打破这场“延迟的谎言”?答案并非寻找一个新的“魔法数字”,而是一场从思想到工具的全面革新。
拥抱完整分布:我们必须停止追逐单一指标,转而关注完整的延迟分布曲线。最大值不是噪音,而是最重要的信号。它告诉你系统最坏的可能性,这正是用户可能放弃你的时刻。
校准你的工具:用一个简单的“CTRL+Z”测试(手动暂停被测服务几秒钟)就能轻易揭穿“协同遗漏”的谎言。如果你的工具在这种情况下依然报告出漂亮的数字,那么它产出的所有数据都毫无价值,必须被丢弃。
使用正确的武器:幸运的是,已有工具在为此努力。Gil Tene开发的HdrHistogram就是一个典范,它能以极高的精度记录完整的延迟分布,并内置了针对“协同遗漏”的修正机制,确保数据的真实性。
关注可持续的吞吐量:性能测试的目的不是看系统在“撞墙”的饱和状态下表现如何,而是为了确定在满足服务等级目标(SLO)的前提下,系统能稳定承载多大的负载。这才是决定你需要多少台机器、如何规划容量的依据。
从星巴克中国将其可观测性平台从缓慢的日志查询升级为毫秒级响应的指标系统,到Cloudflare工程师通过修复一个微小的阻塞I/O问题将p99延迟提升6倍,业界领先者早已意识到,性能的真相隐藏在被平均值掩盖的细节之中。
我们必须承认,理解系统性能是一项复杂的工作。它需要我们放弃对简单答案的执着,勇敢地直面那些不那么漂亮的、充满毛刺的真实数据。因为最危险的谎言,往往就是我们自己的数据告诉我们的。唯有如此,我们才能真正从用户的视角出发,构建真正稳定、可靠的系统。