同一条公式,在别处
如果这本书只在服务器上有用,它就不值得写成一本书。这一章把那面墙搬到公路上、工厂里、医院里和你的日程表上——而在其中一个地方,它比在软件里还要狠。
一条高速公路,自由流车速 100 km/h,完全堵死时的车流密度是 140 辆/公里。
随着车越来越多,车速会下降,但车更多了,所以每小时通过的车辆数(通过量)……
通过量最大时,车速是多少?
高速公路:比服务器还狠
交通流有一个最简单也最著名的模型(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 定律的证明只用到「面积可以按两种方式算」。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] 之间都完全正常。