Skip to content
About
Main content

Little's Law and the queueing wall

Which simple arithmetic controls every queue and thread pool, and why is 80% utilization already too much?

No medium, only arithmetic

Storage, CPU and network were about mechanisms: what things are made of and what that forces. This article has no medium. These results hold for disks, caches, networks, thread pools, Kafka consumers and the line at a bank, because they come from arithmetic and probability alone:

Two ideas produce the whole article:

  1. Conservation: what arrives must leave or wait. This is . It is bookkeeping, and it cannot be false.
  2. Variability: arrivals and service times fluctuate. Fluctuation plus a limited server makes queues even when average capacity is enough. Most painful performance problems come from variability, not from lack of throughput.

Earlier parts said predictability beats work (CPU) and pattern beats volume (network). This article gives the mathematics: variance is the enemy, and averages hide it.


Little's Law

RelationshipLittle's Law →
average number of items inside the system (the concurrency)
arrival rate (items per second)
average time an item stays in the system (residence time, including waiting)
L = 1 in flightL = 12L = 80
Data table
Throughput a fixed concurrency sustains, by latency
Latency W (seconds)seriesThroughput λ (per second)
1 µsL = 1 in flight1M
1.19 µsL = 1 in flight841K
1.41 µsL = 1 in flight708K
1.68 µsL = 1 in flight596K
2 µsL = 1 in flight501K
2.37 µsL = 1 in flight422K
2.82 µsL = 1 in flight355K
3.35 µsL = 1 in flight299K
3.98 µsL = 1 in flight251K
4.73 µsL = 1 in flight211K
5.62 µsL = 1 in flight178K
6.68 µsL = 1 in flight150K
7.94 µsL = 1 in flight126K
9.44 µsL = 1 in flight106K
11.2 µsL = 1 in flight89.1K
13.3 µsL = 1 in flight75K
15.8 µsL = 1 in flight63.1K
18.8 µsL = 1 in flight53.1K
22.4 µsL = 1 in flight44.7K
26.6 µsL = 1 in flight37.6K
31.6 µsL = 1 in flight31.6K
37.6 µsL = 1 in flight26.6K
44.7 µsL = 1 in flight22.4K
53.1 µsL = 1 in flight18.8K
63.1 µsL = 1 in flight15.8K
75 µsL = 1 in flight13.3K
89.1 µsL = 1 in flight11.2K
106 µsL = 1 in flight9.44K
126 µsL = 1 in flight7.94K
150 µsL = 1 in flight6.68K
178 µsL = 1 in flight5.62K
211 µsL = 1 in flight4.73K
251 µsL = 1 in flight3.98K
299 µsL = 1 in flight3.35K
355 µsL = 1 in flight2.82K
422 µsL = 1 in flight2.37K
501 µsL = 1 in flight2K
596 µsL = 1 in flight1.68K
708 µsL = 1 in flight1.41K
841 µsL = 1 in flight1.19K
1 msL = 1 in flight1K
1.19 msL = 1 in flight841
1.41 msL = 1 in flight708
1.68 msL = 1 in flight596
2 msL = 1 in flight501
2.37 msL = 1 in flight422
2.82 msL = 1 in flight355
3.35 msL = 1 in flight299
3.98 msL = 1 in flight251
4.73 msL = 1 in flight211
5.62 msL = 1 in flight178
6.68 msL = 1 in flight150
7.94 msL = 1 in flight126
9.44 msL = 1 in flight106
11.2 msL = 1 in flight89.1
13.3 msL = 1 in flight75
15.8 msL = 1 in flight63.1
18.8 msL = 1 in flight53.1
22.4 msL = 1 in flight44.7
26.6 msL = 1 in flight37.6
31.6 msL = 1 in flight31.6
37.6 msL = 1 in flight26.6
44.7 msL = 1 in flight22.4
53.1 msL = 1 in flight18.8
63.1 msL = 1 in flight15.8
75 msL = 1 in flight13.3
89.1 msL = 1 in flight11.2
106 msL = 1 in flight9.44
126 msL = 1 in flight7.94
150 msL = 1 in flight6.68
178 msL = 1 in flight5.62
211 msL = 1 in flight4.73
251 msL = 1 in flight3.98
299 msL = 1 in flight3.35
355 msL = 1 in flight2.82
422 msL = 1 in flight2.37
501 msL = 1 in flight2
596 msL = 1 in flight1.68
708 msL = 1 in flight1.41
841 msL = 1 in flight1.19
1 sL = 1 in flight1
1 µsL = 1212M
1.19 µsL = 1210.1M
1.41 µsL = 128.5M
1.68 µsL = 127.15M
2 µsL = 126.01M
2.37 µsL = 125.06M
2.82 µsL = 124.26M
3.35 µsL = 123.58M
3.98 µsL = 123.01M
4.73 µsL = 122.54M
5.62 µsL = 122.13M
6.68 µsL = 121.8M
7.94 µsL = 121.51M
9.44 µsL = 121.27M
11.2 µsL = 121.07M
13.3 µsL = 12900K
15.8 µsL = 12757K
18.8 µsL = 12637K
22.4 µsL = 12536K
26.6 µsL = 12451K
31.6 µsL = 12379K
37.6 µsL = 12319K
44.7 µsL = 12269K
53.1 µsL = 12226K
63.1 µsL = 12190K
75 µsL = 12160K
89.1 µsL = 12135K
106 µsL = 12113K
126 µsL = 1295.3K
150 µsL = 1280.2K
178 µsL = 1267.5K
211 µsL = 1256.8K
251 µsL = 1247.8K
299 µsL = 1240.2K
355 µsL = 1233.8K
422 µsL = 1228.5K
501 µsL = 1223.9K
596 µsL = 1220.1K
708 µsL = 1217K
841 µsL = 1214.3K
1 msL = 1212K
1.19 msL = 1210.1K
1.41 msL = 128.5K
1.68 msL = 127.15K
2 msL = 126.01K
2.37 msL = 125.06K
2.82 msL = 124.26K
3.35 msL = 123.58K
3.98 msL = 123.01K
4.73 msL = 122.54K
5.62 msL = 122.13K
6.68 msL = 121.8K
7.94 msL = 121.51K
9.44 msL = 121.27K
11.2 msL = 121.07K
13.3 msL = 12900
15.8 msL = 12757
18.8 msL = 12637
22.4 msL = 12536
26.6 msL = 12451
31.6 msL = 12379
37.6 msL = 12319
44.7 msL = 12269
53.1 msL = 12226
63.1 msL = 12190
75 msL = 12160
89.1 msL = 12135
106 msL = 12113
126 msL = 1295.3
150 msL = 1280.2
178 msL = 1267.5
211 msL = 1256.8
251 msL = 1247.8
299 msL = 1240.2
355 msL = 1233.8
422 msL = 1228.5
501 msL = 1223.9
596 msL = 1220.1
708 msL = 1217
841 msL = 1214.3
1 sL = 1212
1 µsL = 8080M
1.19 µsL = 8067.3M
1.41 µsL = 8056.6M
1.68 µsL = 8047.7M
2 µsL = 8040.1M
2.37 µsL = 8033.7M
2.82 µsL = 8028.4M
3.35 µsL = 8023.9M
3.98 µsL = 8020.1M
4.73 µsL = 8016.9M
5.62 µsL = 8014.2M
6.68 µsL = 8012M
7.94 µsL = 8010.1M
9.44 µsL = 808.47M
11.2 µsL = 807.13M
13.3 µsL = 806M
15.8 µsL = 805.05M
18.8 µsL = 804.25M
22.4 µsL = 803.57M
26.6 µsL = 803.01M
31.6 µsL = 802.53M
37.6 µsL = 802.13M
44.7 µsL = 801.79M
53.1 µsL = 801.51M
63.1 µsL = 801.27M
75 µsL = 801.07M
89.1 µsL = 80898K
106 µsL = 80755K
126 µsL = 80635K
150 µsL = 80535K
178 µsL = 80450K
211 µsL = 80379K
251 µsL = 80318K
299 µsL = 80268K
355 µsL = 80225K
422 µsL = 80190K
501 µsL = 80160K
596 µsL = 80134K
708 µsL = 80113K
841 µsL = 8095.1K
1 msL = 8080K
1.19 msL = 8067.3K
1.41 msL = 8056.6K
1.68 msL = 8047.7K
2 msL = 8040.1K
2.37 msL = 8033.7K
2.82 msL = 8028.4K
3.35 msL = 8023.9K
3.98 msL = 8020.1K
4.73 msL = 8016.9K
5.62 msL = 8014.2K
6.68 msL = 8012K
7.94 msL = 8010.1K
9.44 msL = 808.47K
11.2 msL = 807.13K
13.3 msL = 806K
15.8 msL = 805.05K
18.8 msL = 804.25K
22.4 msL = 803.57K
26.6 msL = 803.01K
31.6 msL = 802.53K
37.6 msL = 802.13K
44.7 msL = 801.79K
53.1 msL = 801.51K
63.1 msL = 801.27K
75 msL = 801.07K
89.1 msL = 80898
106 msL = 80755
126 msL = 80635
150 msL = 80535
178 msL = 80450
211 msL = 80379
251 msL = 80318
299 msL = 80268
355 msL = 80225
422 msL = 80190
501 msL = 80160
596 msL = 80134
708 msL = 80113
841 msL = 8095.1
1 sL = 8080

It is a conservation identity: no assumptions about distributions or independence. If 100 customers per hour enter a shop and each stays 30 minutes, then on average 100 × 0.5 = 50 customers are inside. It cannot be wrong.

One law in four places

WhereForm
queue depth = QD ÷
Memory-level parallelism = outstanding misses × 64 B ÷ 80 ns
Bandwidth-delay productin-flight = bandwidth ×
HereL = λW

When something is slow and you cannot find the bottleneck, first solve for the missing term. Usually the concurrency is too low, which no average-based metric shows.

Inferring what you cannot measure

You can usually measure two of the three terms. Queue depth hard to measure? Compute L = λW.

Example (a limited pool). A database connection pool has 50 connections and each query holds one for 100 ms. Then λ_max = L / W = 50 / 0.1 = 500 queries per second. If traffic doubles to 1,000/s, W cannot halve, so requests wait, and the waiting time becomes part of W. A pool of 50, a thread pool of 200, a max_concurrent_requests setting: each is you choosing L. By choosing it, you chose the relation between throughput and latency. You cannot choose both.


Utilization and the queueing wall

Why queues exist

If arrivals were perfectly regular and service time perfectly constant, a server at 99% would have no queue.

Queues are not caused by load. They are caused by variability meeting load. (If one customer arrives exactly every 60 s and each takes exactly 59 s, nobody waits. Add randomness to either, and waiting appears.)

Utilization (ρ, "rho") = fraction of time the server is busy = .

The M/M/1 result

For one server with random arrivals and random service times, the average response time is

average response time (waiting plus service)
the average service time
fraction of time the server is busy = arrival rate × average service time
Data table
Response time as utilization rises (S = 1)
Utilization ρResponse time R (× S)
01×
0.0121.01×
0.0251.03×
0.0371.04×
0.0491.05×
0.0611.07×
0.0741.08×
0.0861.09×
0.0981.11×
0.111.12×
0.1231.14×
0.1351.16×
0.1471.17×
0.1591.19×
0.1711.21×
0.1841.23×
0.1961.24×
0.2081.26×
0.2211.28×
0.2331.3×
0.2451.32×
0.2571.35×
0.2691.37×
0.2821.39×
0.2941.42×
0.3061.44×
0.3191.47×
0.3311.49×
0.3431.52×
0.3551.55×
0.3671.58×
0.381.61×
0.3921.64×
0.4041.68×
0.4161.71×
0.4291.75×
0.4411.79×
0.4531.83×
0.4661.87×
0.4781.91×
0.491.96×
0.5022.01×
0.5142.06×
0.5272.11×
0.5392.17×
0.5512.23×
0.5642.29×
0.5762.36×
0.5882.43×
0.62.5×
0.6132.58×
0.6252.66×
0.6372.75×
0.6492.85×
0.6612.95×
0.6743.07×
0.6863.18×
0.6983.31×
0.713.45×
0.7233.61×
0.7353.77×
0.7473.96×
0.7594.16×
0.7724.38×
0.7844.63×
0.7964.91×
0.8085.22×
0.8215.58×
0.8335.99×
0.8456.46×
0.8577.02×
0.877.68×
0.8828.47×
0.8949.46×
0.90610.7×
0.91912.3×
0.93114.5×
0.94317.6×
0.95622.5×
0.96831×
0.9850×

where S is the average service time. Do not memorize the formula; look at the shape:

Utilization ρResponse time R
0.5 (50%)2 × S
0.8 (80%)5 × S
0.9 (90%)10 × S
0.9520 × S
0.99 (99%)100 × S

It is a hyperbola with a wall at 100%, so the last few percent of utilization cost more than the first eighty.

Kingman's formula: utilization sets the multiplier, variability sets what is multiplied

A more useful general form (Kingman's approximation):

the average waiting time
fraction of time the server is busy
how variable arrivals are
how variable service times are
the average service time
cₛ² = 1 (steady)cₛ² = 4cₛ² = 19 (a few very slow requests)
Data table
Waiting time by utilization, for three service-time variabilities (cₐ² = 1, S = 1)
Utilization ρseriesWaiting time Wq (× S)
0.012cₛ² = 1 (steady)0.012×
0.024cₛ² = 1 (steady)0.024×
0.036cₛ² = 1 (steady)0.037×
0.048cₛ² = 1 (steady)0.05×
0.059cₛ² = 1 (steady)0.063×
0.071cₛ² = 1 (steady)0.077×
0.083cₛ² = 1 (steady)0.091×
0.095cₛ² = 1 (steady)0.105×
0.107cₛ² = 1 (steady)0.12×
0.119cₛ² = 1 (steady)0.135×
0.131cₛ² = 1 (steady)0.15×
0.142cₛ² = 1 (steady)0.166×
0.154cₛ² = 1 (steady)0.183×
0.166cₛ² = 1 (steady)0.199×
0.178cₛ² = 1 (steady)0.217×
0.19cₛ² = 1 (steady)0.235×
0.202cₛ² = 1 (steady)0.253×
0.214cₛ² = 1 (steady)0.272×
0.226cₛ² = 1 (steady)0.291×
0.237cₛ² = 1 (steady)0.311×
0.249cₛ² = 1 (steady)0.332×
0.261cₛ² = 1 (steady)0.354×
0.273cₛ² = 1 (steady)0.376×
0.285cₛ² = 1 (steady)0.399×
0.297cₛ² = 1 (steady)0.422×
0.309cₛ² = 1 (steady)0.447×
0.321cₛ² = 1 (steady)0.472×
0.332cₛ² = 1 (steady)0.498×
0.344cₛ² = 1 (steady)0.525×
0.356cₛ² = 1 (steady)0.553×
0.368cₛ² = 1 (steady)0.583×
0.38cₛ² = 1 (steady)0.613×
0.392cₛ² = 1 (steady)0.644×
0.404cₛ² = 1 (steady)0.677×
0.416cₛ² = 1 (steady)0.711×
0.427cₛ² = 1 (steady)0.747×
0.439cₛ² = 1 (steady)0.784×
0.451cₛ² = 1 (steady)0.822×
0.463cₛ² = 1 (steady)0.863×
0.475cₛ² = 1 (steady)0.905×
0.487cₛ² = 1 (steady)0.949×
0.499cₛ² = 1 (steady)0.995×
0.511cₛ² = 1 (steady)1.04×
0.522cₛ² = 1 (steady)1.09×
0.534cₛ² = 1 (steady)1.15×
0.546cₛ² = 1 (steady)1.2×
0.558cₛ² = 1 (steady)1.26×
0.57cₛ² = 1 (steady)1.33×
0.582cₛ² = 1 (steady)1.39×
0.594cₛ² = 1 (steady)1.46×
0.606cₛ² = 1 (steady)1.54×
0.617cₛ² = 1 (steady)1.61×
0.629cₛ² = 1 (steady)1.7×
0.641cₛ² = 1 (steady)1.79×
0.653cₛ² = 1 (steady)1.88×
0.665cₛ² = 1 (steady)1.99×
0.677cₛ² = 1 (steady)2.09×
0.689cₛ² = 1 (steady)2.21×
0.701cₛ² = 1 (steady)2.34×
0.713cₛ² = 1 (steady)2.48×
0.724cₛ² = 1 (steady)2.63×
0.736cₛ² = 1 (steady)2.79×
0.748cₛ² = 1 (steady)2.97×
0.76cₛ² = 1 (steady)3.17×
0.772cₛ² = 1 (steady)3.38×
0.784cₛ² = 1 (steady)3.62×
0.796cₛ² = 1 (steady)3.89×
0.807cₛ² = 1 (steady)4.19×
0.819cₛ² = 1 (steady)4.54×
0.831cₛ² = 1 (steady)4.93×
0.843cₛ² = 1 (steady)5.37×
0.855cₛ² = 1 (steady)5.9×
0.867cₛ² = 1 (steady)6.51×
0.879cₛ² = 1 (steady)7.25×
0.891cₛ² = 1 (steady)8.14×
0.903cₛ² = 1 (steady)9.26×
0.914cₛ² = 1 (steady)10.7×
0.926cₛ² = 1 (steady)12.6×
0.938cₛ² = 1 (steady)15.2×
0.95cₛ² = 1 (steady)19×
0.012cₛ² = 40.03×
0.024cₛ² = 40.061×
0.036cₛ² = 40.092×
0.048cₛ² = 40.125×
0.059cₛ² = 40.158×
0.071cₛ² = 40.192×
0.083cₛ² = 40.227×
0.095cₛ² = 40.262×
0.107cₛ² = 40.299×
0.119cₛ² = 40.337×
0.131cₛ² = 40.376×
0.142cₛ² = 40.415×
0.154cₛ² = 40.456×
0.166cₛ² = 40.499×
0.178cₛ² = 40.542×
0.19cₛ² = 40.586×
0.202cₛ² = 40.632×
0.214cₛ² = 40.68×
0.226cₛ² = 40.728×
0.237cₛ² = 40.779×
0.249cₛ² = 40.831×
0.261cₛ² = 40.884×
0.273cₛ² = 40.939×
0.285cₛ² = 40.997×
0.297cₛ² = 41.06×
0.309cₛ² = 41.12×
0.321cₛ² = 41.18×
0.332cₛ² = 41.25×
0.344cₛ² = 41.31×
0.356cₛ² = 41.38×
0.368cₛ² = 41.46×
0.38cₛ² = 41.53×
0.392cₛ² = 41.61×
0.404cₛ² = 41.69×
0.416cₛ² = 41.78×
0.427cₛ² = 41.87×
0.439cₛ² = 41.96×
0.451cₛ² = 42.06×
0.463cₛ² = 42.16×
0.475cₛ² = 42.26×
0.487cₛ² = 42.37×
0.499cₛ² = 42.49×
0.511cₛ² = 42.61×
0.522cₛ² = 42.74×
0.534cₛ² = 42.87×
0.546cₛ² = 43.01×
0.558cₛ² = 43.16×
0.57cₛ² = 43.31×
0.582cₛ² = 43.48×
0.594cₛ² = 43.65×
0.606cₛ² = 43.84×
0.617cₛ² = 44.04×
0.629cₛ² = 44.25×
0.641cₛ² = 44.47×
0.653cₛ² = 44.71×
0.665cₛ² = 44.96×
0.677cₛ² = 45.24×
0.689cₛ² = 45.53×
0.701cₛ² = 45.85×
0.713cₛ² = 46.2×
0.724cₛ² = 46.57×
0.736cₛ² = 46.98×
0.748cₛ² = 47.43×
0.76cₛ² = 47.92×
0.772cₛ² = 48.46×
0.784cₛ² = 49.06×
0.796cₛ² = 49.73×
0.807cₛ² = 410.5×
0.819cₛ² = 411.3×
0.831cₛ² = 412.3×
0.843cₛ² = 413.4×
0.855cₛ² = 414.7×
0.867cₛ² = 416.3×
0.879cₛ² = 418.1×
0.891cₛ² = 420.4×
0.903cₛ² = 423.1×
0.914cₛ² = 426.7×
0.926cₛ² = 431.4×
0.938cₛ² = 437.9×
0.95cₛ² = 447.5×
0.012cₛ² = 19 (a few very slow requests)0.12×
0.024cₛ² = 19 (a few very slow requests)0.243×
0.036cₛ² = 19 (a few very slow requests)0.369×
0.048cₛ² = 19 (a few very slow requests)0.499×
0.059cₛ² = 19 (a few very slow requests)0.631×
0.071cₛ² = 19 (a few very slow requests)0.767×
0.083cₛ² = 19 (a few very slow requests)0.907×
0.095cₛ² = 19 (a few very slow requests)1.05×
0.107cₛ² = 19 (a few very slow requests)1.2×
0.119cₛ² = 19 (a few very slow requests)1.35×
0.131cₛ² = 19 (a few very slow requests)1.5×
0.142cₛ² = 19 (a few very slow requests)1.66×
0.154cₛ² = 19 (a few very slow requests)1.83×
0.166cₛ² = 19 (a few very slow requests)1.99×
0.178cₛ² = 19 (a few very slow requests)2.17×
0.19cₛ² = 19 (a few very slow requests)2.35×
0.202cₛ² = 19 (a few very slow requests)2.53×
0.214cₛ² = 19 (a few very slow requests)2.72×
0.226cₛ² = 19 (a few very slow requests)2.91×
0.237cₛ² = 19 (a few very slow requests)3.11×
0.249cₛ² = 19 (a few very slow requests)3.32×
0.261cₛ² = 19 (a few very slow requests)3.54×
0.273cₛ² = 19 (a few very slow requests)3.76×
0.285cₛ² = 19 (a few very slow requests)3.99×
0.297cₛ² = 19 (a few very slow requests)4.22×
0.309cₛ² = 19 (a few very slow requests)4.47×
0.321cₛ² = 19 (a few very slow requests)4.72×
0.332cₛ² = 19 (a few very slow requests)4.98×
0.344cₛ² = 19 (a few very slow requests)5.25×
0.356cₛ² = 19 (a few very slow requests)5.53×
0.368cₛ² = 19 (a few very slow requests)5.83×
0.38cₛ² = 19 (a few very slow requests)6.13×
0.392cₛ² = 19 (a few very slow requests)6.44×
0.404cₛ² = 19 (a few very slow requests)6.77×
0.416cₛ² = 19 (a few very slow requests)7.11×
0.427cₛ² = 19 (a few very slow requests)7.47×
0.439cₛ² = 19 (a few very slow requests)7.84×
0.451cₛ² = 19 (a few very slow requests)8.22×
0.463cₛ² = 19 (a few very slow requests)8.63×
0.475cₛ² = 19 (a few very slow requests)9.05×
0.487cₛ² = 19 (a few very slow requests)9.49×
0.499cₛ² = 19 (a few very slow requests)9.95×
0.511cₛ² = 19 (a few very slow requests)10.4×
0.522cₛ² = 19 (a few very slow requests)10.9×
0.534cₛ² = 19 (a few very slow requests)11.5×
0.546cₛ² = 19 (a few very slow requests)12×
0.558cₛ² = 19 (a few very slow requests)12.6×
0.57cₛ² = 19 (a few very slow requests)13.3×
0.582cₛ² = 19 (a few very slow requests)13.9×
0.594cₛ² = 19 (a few very slow requests)14.6×
0.606cₛ² = 19 (a few very slow requests)15.4×
0.617cₛ² = 19 (a few very slow requests)16.1×
0.629cₛ² = 19 (a few very slow requests)17×
0.641cₛ² = 19 (a few very slow requests)17.9×
0.653cₛ² = 19 (a few very slow requests)18.8×
0.665cₛ² = 19 (a few very slow requests)19.9×
0.677cₛ² = 19 (a few very slow requests)20.9×
0.689cₛ² = 19 (a few very slow requests)22.1×
0.701cₛ² = 19 (a few very slow requests)23.4×
0.713cₛ² = 19 (a few very slow requests)24.8×
0.724cₛ² = 19 (a few very slow requests)26.3×
0.736cₛ² = 19 (a few very slow requests)27.9×
0.748cₛ² = 19 (a few very slow requests)29.7×
0.76cₛ² = 19 (a few very slow requests)31.7×
0.772cₛ² = 19 (a few very slow requests)33.8×
0.784cₛ² = 19 (a few very slow requests)36.2×
0.796cₛ² = 19 (a few very slow requests)38.9×
0.807cₛ² = 19 (a few very slow requests)41.9×
0.819cₛ² = 19 (a few very slow requests)45.4×
0.831cₛ² = 19 (a few very slow requests)49.3×
0.843cₛ² = 19 (a few very slow requests)53.7×
0.855cₛ² = 19 (a few very slow requests)59×
0.867cₛ² = 19 (a few very slow requests)65.1×
0.879cₛ² = 19 (a few very slow requests)72.5×
0.891cₛ² = 19 (a few very slow requests)81.4×
0.903cₛ² = 19 (a few very slow requests)92.6×
0.914cₛ² = 19 (a few very slow requests)107×
0.926cₛ² = 19 (a few very slow requests)126×
0.938cₛ² = 19 (a few very slow requests)152×
0.95cₛ² = 19 (a few very slow requests)190×

Wq is the average waiting time. cₐ² and cₛ² measure how variable arrivals and service times are. The first factor depends only on utilization, the second only on variability. Example: two systems at 80% utilization, both with cₐ² = 1. In the first, service times are steady (cₛ² = 1 → factor 1). In the second, a few very slow requests give cₛ² = 19 → factor 10. The second waits 10× more at the same utilization. This is why one slow query type can ruin a whole pool.

Two more results

  • Servers sharing one queue are far better than separate queues. N servers with one shared queue wait much less than N single-server queues at the same ρ, because a burst can move to an idle worker. This is the reason to prefer shared queues, and why the "power of two choices" load-balancing method (pick two servers at random, send to the less busy one) beats purely random choice by a lot.
  • . It is a position on a curve. "CPU at 75%" means nothing until you know where the knee of the curve is for your variability.

Why 80% has already used up the budget

  • At ρ = 0.8, response is 5× service time on average, and the tail is much worse. The tail of a queue decays roughly like e^(−(1−ρ)t/S): as ρ → 1 the tail stretches much faster than the average.

  • The headroom argument is the practical point. At ρ = 0.8, a 25% traffic increase gives ρ = 1.0: the queue grows without limit. At ρ = 0.5, the same 25% gives 0.625 and response time rises only from 2 × S to 1/(1 − 0.625) = 2.67 × S. You do not buy average speed with headroom. You buy the ability to absorb variance without falling off a cliff. (This is Meera's launch day: 80% × 1.3 > 100%.)

  • Feedback loops make it worse than the static model. Slow responses → client timeouts → retries → higher arrival rate → even slower. Real systems have this positive feedback. It is the congestion collapse of The network, generalized. It is why retry budgets, circuit breakers and load shedding exist. .

  • Two honest exceptions, because "the 80% rule" is often repeated without thought:

    • Batch systems should run at 95%+. Nobody waits; throughput is the goal (the latency/throughput trade-off again).
    • Low-variability workloads with strict admission control can safely run hotter.

    The rule is not "80%". The rule is "know your knee."