IT 论文精读 · PAPER 27

The Tail at Scale:大规模系统的尾延迟

Dean & Barroso · Google · CACM 2013

EN →

这篇论文干了什么?

2013 年,Google 的 Jeff Dean 和 Luiz Barroso 写了一篇只有几页的短文《The Tail at Scale》,讲一件做大型网站的人都躲不开的事:为什么系统「平均很快」,用户却总能碰上卡顿。他们的答案不是「把每台机器都修得更快」——那做不到——而是承认机器一定会偶尔慢,再让软件把这种慢兜住

先说个怪事

假设你的机器很争气:每台有 99% 的概率一秒内回话,只有 1% 的时候会打个盹。可现代的一次网页搜索,要同时问一百台机器、等它们全都回话才能拼出结果。这时候——六成以上的请求都会超过一秒。每台都「99 分优秀」,合起来却「六成不及格」。

原因很朴素:你等的不是平均,是最慢那一个。一个人出门总能准时,二十个人的团队几乎不可能同时到齐——只要一个人迟到,全队就得等。规模不是把好运相加,而是把坏运放大

而那点「打盹」并不是机器坏了,是它总有别的事在身:同机还跑着别人的程序在抢 CPU 和内存;后台程序偶尔要整理积攒的数据;内存里的垃圾要回收,回收时得停下手里的活打扫;机器太热会自动降速;请求还要一层层排队。每一项都只偶尔耽误几毫秒,可只要你同时等着上百台,就总有一台正好在打盹。

那个点子:把「慢」当故障来容错

工程史上有过一次重要的心态转变:我们不再指望机器不坏,而是假设它一定会坏,靠多存副本、坏了就换一份,让系统照样能用——这叫容错。这篇文章说:对「慢」也照这个办。

最直接的一招叫备份请求:向一台机器发出请求后,如果它迟迟不回,就再向另一台存着同样数据的机器问一遍,谁先答用谁的,再把另一份取消掉。妙处在代价极小——只有那少数几个慢请求才会触发第二问,多发出去的请求还不到百分之几,而最慢那一小撮请求的耗时能从「一两秒」掉到「几十毫秒」。另一招是提前避开:某台机器最近明显反应慢,就先把它从名单里摘出来观察——摘掉一台慢机器,整体反而变快

一个反直觉的小妙招

后台清理这类必须做的脏活,直觉上应该「大家错开时间做,别撞一起」。文章却说:恰恰要让所有机器同时做。理由一想就通——错开的话,任何时刻总有某台机器正忙着打扫,而你每次都要等所有机器,于是每个请求都被拖一下;全体同时打扫,则只有那一小段时间的请求受影响,其余时间干干净净

说句诚实的:这些办法多半是用余量换稳定——多问一遍、多留副本,都得有机器闲着才使得出来;集群本来就满负荷时,多发的请求反而会把大家一起拖慢。

一句话记住

在成百上千台机器上,你等的是最慢那一个,所以「偶尔慢一下」会被规模放大成「经常慢」。既然根治不了,就像当年对付「机器会坏」那样去对付「机器会慢」:多问一台、谁快用谁、把脏活集中到同一时刻、把慢机器先摘掉——让系统对长尾容错

想看放大效应的曲线、对冲/绑定请求的时序图和实测数字? → 切到精读版