卷 VI · 留余CH 23深度 23/24

同一条公式,在别处

如果这本书只在服务器上有用,它就不值得写成一本书。这一章把那面墙搬到公路上、工厂里、医院里和你的日程表上——而在其中一个地方,它比在软件里还要狠。

高速公路看板 WIP拥堵定价

▷ 先估一个数

一条高速公路,自由流车速 100 km/h,完全堵死时的车流密度是 140 辆/公里。

随着车越来越多,车速会下降,但车更多了,所以每小时通过的车辆数(通过量)……

通过量最大时,车速是多少?

A 接近 100 km/h——车速越快通过量当然越大 B 大约 75 km/h C 50 km/h——恰好是自由流车速的一半 D 大约 25 km/h——挤一点通过量更大

高速公路:比服务器还狠

交通流有一个最简单也最著名的模型(Greenshields,1935):车速随密度线性下降

车速 v(k) = 自由流车速 × (1 − 密度 ÷ 堵死密度)
通过量 q(k) = 密度 × 车速 = k × v_f × (1 − k/k_j)

# 这是一条**开口向下的抛物线**!
# 最大值在 k = k_j / 2,也就是堵死密度的一半

自由流 100 km/h,堵死密度 140 辆/km:
  最大通过量 3500 辆/小时
  出现在密度 70 辆/km、车速 50 km/h

拖那根滑杆,注意曲线的形状。它和第 9 章那面墙有一个关键的区别

服务器过了临界点,吞吐会保持在最大值(只是延迟爆炸)。高速公路过了临界点,通过量本身会下降。

这是一个质的差别。软件系统的 ρ 逼近 1 时,你至少还在以最大速度产出;而高速公路进入拥堵侧之后,路的产能真的变小了

最直白的证据是「同一个通过量对应两个状态」:

通过量畅通侧拥堵侧
3000 辆/小时密度 43.5,跑 69 km/h密度 96.5,爬 31 km/h

同样是每小时过 3000 辆车。一个状态里大家开 69,另一个状态里大家爬 31。而这条路本身完全一样。

幽灵堵车

这个模型还解释了那个让所有司机抓狂的现象:堵了半小时,过去之后发现前面什么都没有。

机制是这样的:在临界密度附近,一辆车轻点一下刹车,后面那辆必须踩得更重一点(因为反应时间),再后面那辆更重……这个扰动向后传播并被放大,最后形成一堵停止的车墙。而那堵墙本身还在缓慢向后移动——所以你穿过它之后,前面确实什么都没有。

一辆车都没多,一条车道都没少,路就堵死了。这是第 3 章那句话(「排队的第二个成因是不齐」)在物理世界里最纯粹的演示。

匝道信号灯

知道了这条曲线,一个反直觉的政策就变得显然了:在入口处设红绿灯,限制进入主路的车流

这看起来是在故意制造拥堵(匝道上要排队),但它能让主路保持在临界密度以下,从而让整条路的通过量停在 3500 而不是掉到 2000。

这是背压(第 22 章)在混凝土上的实现,也是第 21 章那句「有界队列优于无界队列」的实物版:让一部分车在匝道上明确地等,好过让所有车在主路上一起爬。

看板:Little 定律的实物版

制造业和敏捷开发里的看板(kanban)方法,核心规矩只有一条:限制在制品数量(WIP limit)。

为什么这条规矩有效?第 2 章已经给了答案:

L = λ × W        →        W = L ÷ λ

  L = 在制品数量(看板上"进行中"那一列有几张卡)
  λ = 交付速度(每周完成几张)
  W = 周期时间(一张卡从开始到完成要多久)

# 如果一个团队每周交付 10 张卡,看板上永远挂着 40 张:
W = 40 ÷ 10 = 4 周

# 想让 W 变成 2 周,只有两条路:
#   ① 提高 λ(更快地交付)—— 难
#   ② 把 L 砍到 20 —— 只需要**停止开始新工作**  ★

第二条路是免费的,而且是恒等式保证的,不是「可能会改善」。这就是看板最反直觉的地方:「少做几件事」直接、按比例地缩短了每件事的完成时间。

而且还有第二层收益,来自第 15 章:同时进行的事情越少,需要互相协调的配对数越少(USL 的 β 项越小)。所以限制 WIP 不只让 W 变小,还让 λ 变大——两个方向的收益叠加。

◆ 一张跨领域对照表

把这本书的三个因子翻译到不同领域:

领域「有多满」「有多不齐」「一次多久」
服务器CPU 利用率延迟直方图的 c²p50 处理时间
高速公路车流密度车速差异、变道、刹车车长 + 车距
医院占床率病情严重度差异平均住院天数
工厂设备利用率换型时间、批量差异单件工时
软件团队每个人手上有几件事任务大小差异单个任务工时
你的日程排满了几成会议超时的随机性单个会议时长

每一行的最后一列(「一次多久」)都是最容易想到、也最难改的。而中间那一列在每个领域里都没有名字——这就是第 3 章说的那件事,它是跨领域的。

拥堵定价:给余量标个价

如果余量这么值钱,为什么大家都在抢着把它用掉?

因为在很多系统里,用掉余量的人不承担成本

你多开一辆车上高速,你自己的通勤时间只增加了一点点,但你让后面所有人都慢了一点。这个差额在经济学里叫负外部性

# 你自己感受到的成本(私人边际成本)
= 你自己的通勤时间

# 你实际造成的成本(社会边际成本)
= 你自己的时间 + (你让每个人多花的时间 × 人数)

# ★ 在墙脚下,第二项按 1/(1−ρ)² 增长(第 10 章那个边际价格)
#   所以在拥堵时段,社会成本可以是私人成本的很多倍。

而这本书的公式给出的正是那个差额的大小。第 10 章算过:在 ρ=0.9 时,边际价格是 ρ=0.5 时的 25 倍。

解法是把外部性内部化——也就是拥堵定价:新加坡的 ERP、伦敦的拥堵费、纽约 2025 年开始的曼哈顿收费区。而它们的共同特点是按时段浮动:高峰贵、平峰便宜。因为外部性的大小取决于你站在曲线的哪一段。

软件世界里的对应物是云的竞价实例API 的分级配额、以及第 19 章那个「让优先级有成本」的建议。它们做的是同一件事:给余量定个价,让消耗它的人看见账单。

✎ 术语正名:「效率」

这本书打了二十三章的那个词,到这里可以正面处理了。

「效率」在日常用法里几乎总是指资源利用率:机器别闲着、人别闲着、床别空着、路别空着。

而这本书说的是:在任何有排队的系统里,利用率和响应速度是一对必须交易的量。把利用率推到极限,等于把响应速度推到无穷。

所以「效率」这个词至少要拆成两个:

  • 产出效率:单位时间产出多少。这个越高越好,但它在 ρ 达到某个点之后就不再增长了(高速公路上甚至会下降)。
  • 响应效率:一件事从提出到完成要多久。这个是余量买来的。

把两者混为一谈,就会得出「机器闲着是浪费」这个在排队系统里明确错误的结论。正确的问题不是「怎么消灭空闲」,而是「我应该买多少空闲」。

▸ 在现实里

丰田的「安灯绳」。生产线上任何工人发现问题都可以拉绳停线。这在「利用率至上」的视角下是疯狂的——停线的成本极高。但丰田的逻辑是:让问题立刻暴露,好过让缺陷流到下游。这是第 21 章「快速失败优于拖着」在制造业的版本,而且比软件业早了半个世纪。

为什么急诊科要有「留观区」。它是一个显式的、有界的缓冲区,把「已经进来但还没决定」的病人和「正在治疗」的病人分开。这样床位的利用率可以维持在高位,而缓冲区的长度是可控的、可见的。这正是第 21 章说的「有界队列 + 明确的队列深度」。

你的日程表。如果你把工作日排到 100%,任何一件事超时都会推倒后面全部安排——而且今天推明天,欠的债不会消失(第 21 章)。留 20%–30% 空白的人不是效率低,他是在买响应能力。而且他的实际产出未必更少,因为另一个人的时间大量花在了重新安排上。

「忙」是一个糟糕的信号。如果一个团队里所有人都很忙,那么任何一个突发需求都会排很久的队。而如果所有人都在做「重要但不紧急」的事、随时可以放下——那个团队的响应速度会快得多。组织的健康程度,某种意义上就是它留了多少余量。

✗ 这个直觉是错的
这些都是类比。排队论的公式是为服务器(或者电话交换机)推导的,把它套到交通、医院、团队管理上,最多算个启发式的比喻。 它们不是类比,是同一个数学对象的不同实例。Little 定律的推导(第 2 章)里没有出现任何关于「服务器」的东西——它只需要「东西进来、待一会儿、出去」。

这一点值得说清楚,因为它决定了你能不能真的把这本书用起来。

Little 定律的证明只用到「面积可以按两种方式算」。Kingman 公式的推导只用到「剩余服务时间」和 Little 定律。这两者都没有引用任何领域知识。所以它们在任何满足前提的系统里都成立,就像勾股定理在任何直角三角形里都成立一样。

需要注意的是前提,而不是领域:

  • Little 定律要求稳态(进出平衡)——所以在持续过载的系统里不能用(第 21 章)。
  • Kingman 公式要求到达和服务独立——所以在有重试、有推送的系统里会低估。
  • 所有公式都要求方差有限——所以在重尾场景下要小心(第 5 章)。
  • 而高速公路多了一条:服务台之间会互相干扰(车会挡住车),所以它的产能会随密度下降——这是标准排队模型没有的项。

正确的态度不是「这只是类比所以别当真」,而是「这是定理,但要检查前提」。

◇ 结算

C50 km/h——恰好是自由流车速的一半。

在 Greenshields 模型里,最大通过量总是出现在 密度 = 堵死密度/2车速 = 自由流车速/2 的位置。这条路的最大通过量是 3500 辆/小时

换句话说:要让一条路运送最多的车,最优的状态是让每个人都以一半的速度开。这是个体理性和集体最优严重冲突的地方——没有一个司机想主动开到 50。

A 「车速越快通过量越大」——只在密度很低时成立。通过量是密度 × 车速的乘积,密度趋近 0 时通过量也趋近 0(一条空路,通过量是零)。 B 「大约 75 km/h」——在这个线性模型下不对,但真实的交通流数据显示最优速度确实往往高于自由流的一半(真实的速度-密度关系不是严格线性的)。这个答案在现实中比在模型中更接近。 D 「挤一点更好」——已经越过临界点了。密度 90 时通过量掉到 3214 辆/小时,比峰值少 8.2%;密度再高,掉得更快。

这一章的一句话

那面墙不是服务器的性质,是「排队」这件事的性质;而在高速公路上,越过临界点连产出本身都会下降。

最后一章回到你自己的系统。我会给你一张自查表、一台可以填进你自己数字的计算器,以及一个诚实的说明:为什么你量出来的数和公式对不上是正常的,以及对不上多少才该担心。剧透一下——在 3000 个请求的样本上,一个稳态值为 8.00 毫秒的系统,测出来落在 [6.48, 9.79] 之间都完全正常。