L = λ × W
容量规划中最有用的公式
对于任何稳定的队列,无论其内部结构如何:L = λ × W,其中:
- L = 系统中的平均项目数量(正在处理中或等待中)
- λ (lambda) = 平均到达率(单位时间内的项目数)
- W = 每个项目在系统中停留的平均时间
几何解读:在一个轴上绘制 λ,在另一个轴上绘制 W。乘积 L 是它们所构成的矩形面积。容量规划就存在于这个矩形内部。
为何重要:三个量中的任意两个都可以确定第三个。测量吞吐量与延迟,即可得知占用率;测量占用率与吞吐量,即可得知延迟。该定律具有鲁棒性:它适用于 Web 请求、餐厅餐桌、超市排队以及 CPU 流水线,且无需任何修改。
三个具体示例:
- 一个 Web 服务处理 200 req/s,平均延迟为 50 ms(0.05 s)。L = 200 × 0.05 = 10 个正在处理中。
- 一家咖啡店每小时服务 60 位顾客,平均停留时间为 15 分钟(0.25 h)。L = 60 × 0.25 = 15 位顾客在店内。
- 一个后端池处理 1500 req/s,平均延迟为 200 ms(0.2 s)。L = 1500 × 0.2 = 300 个正在处理中。
规模影响:某一层的 worker 数量 / 线程数 / 连接数必须至少为 L 才能跟上负载。如果少于 L,意味着队列将不断增长。
为什么利用率超过 80% 后延迟会激增
运营中最重要的曲线
在 x 轴上绘制利用率(0% 到 100%),在 y 轴上绘制平均等待时间。该形状是容量规划中最具影响力的曲线之一。
M/M/1 排队模型:对于具有泊松到达(随机)和指数服务时间(随机)的系统,平均等待时间为:
W_q = ρ / (μ × (1 - ρ))
其中 ρ 是利用率(0 到 1),μ 是服务速率。
曲线的形状:
- 当 ρ = 0.5(50% 利用率)时,等待时间很短(1 个服务时间)。
- 当 ρ = 0.7(70% 利用率)时,等待时间约为 2.3 个服务时间。
- 当 ρ = 0.8(80% 利用率)时,等待时间约为 4 个服务时间。
- 当 ρ = 0.9(90% 利用率)时,等待时间约为 9 个服务时间。
- 当 ρ = 0.95(95% 利用率)时,等待时间约为 19 个服务时间。
- 当 ρ = 1.0(100% 利用率)时,等待时间为无穷大。
拐点:在 80% 利用率附近,曲线急剧弯曲。在拐点以下,容量较为充裕;在拐点以上,延迟的增长速度超过利用率的增长速度。
实际解读:稳态下应将利用率目标设定为 70%,切勿达到 100%。这 30% 的“余量”并非浪费,而是实现有界延迟所必须付出的代价。
跨越拐点进行容量规划
两种场景:
场景 A:10 个副本,CPU 使用率为 60%。延迟 p99 = 100 毫秒。
场景 B:同一集群因流量增长,CPU 使用率升至 90%。p99 = 600 毫秒。
相同的集群,相同的代码,仅利用率发生了变化。
容量规划与触发机制的结合
综合应用
现在你可以将利特尔法则(Little's Law)视为一个矩形,解读排队曲线及其拐点,并将两者与容量决策联系起来。
同时应用两者。
后端层处理 2,000 req/s,平均延迟为 50 ms,每个副本在 70% CPU 占用下的容量为 80 req/s。突发系数为 2x;你希望系统能够承受 3 个副本同时故障。
配套笔记
配套笔记
本几何学课程将无状态水平扩展主课程重新表述为定量几何问题。
下一个配套课程 geometry_of_ingress_egress_separation 将网络边界拆分重新表述为一个二分图,其中存在一个由该拆分移除的割点。
做得好。