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:
- Conservation: what arrives must leave or wait. This is Little's Law. It is bookkeeping, and it cannot be false.
- 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
- 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)
Data table
| Latency W (seconds) | series | Throughput λ (per second) |
|---|---|---|
| 1 µs | L = 1 in flight | 1M |
| 1.19 µs | L = 1 in flight | 841K |
| 1.41 µs | L = 1 in flight | 708K |
| 1.68 µs | L = 1 in flight | 596K |
| 2 µs | L = 1 in flight | 501K |
| 2.37 µs | L = 1 in flight | 422K |
| 2.82 µs | L = 1 in flight | 355K |
| 3.35 µs | L = 1 in flight | 299K |
| 3.98 µs | L = 1 in flight | 251K |
| 4.73 µs | L = 1 in flight | 211K |
| 5.62 µs | L = 1 in flight | 178K |
| 6.68 µs | L = 1 in flight | 150K |
| 7.94 µs | L = 1 in flight | 126K |
| 9.44 µs | L = 1 in flight | 106K |
| 11.2 µs | L = 1 in flight | 89.1K |
| 13.3 µs | L = 1 in flight | 75K |
| 15.8 µs | L = 1 in flight | 63.1K |
| 18.8 µs | L = 1 in flight | 53.1K |
| 22.4 µs | L = 1 in flight | 44.7K |
| 26.6 µs | L = 1 in flight | 37.6K |
| 31.6 µs | L = 1 in flight | 31.6K |
| 37.6 µs | L = 1 in flight | 26.6K |
| 44.7 µs | L = 1 in flight | 22.4K |
| 53.1 µs | L = 1 in flight | 18.8K |
| 63.1 µs | L = 1 in flight | 15.8K |
| 75 µs | L = 1 in flight | 13.3K |
| 89.1 µs | L = 1 in flight | 11.2K |
| 106 µs | L = 1 in flight | 9.44K |
| 126 µs | L = 1 in flight | 7.94K |
| 150 µs | L = 1 in flight | 6.68K |
| 178 µs | L = 1 in flight | 5.62K |
| 211 µs | L = 1 in flight | 4.73K |
| 251 µs | L = 1 in flight | 3.98K |
| 299 µs | L = 1 in flight | 3.35K |
| 355 µs | L = 1 in flight | 2.82K |
| 422 µs | L = 1 in flight | 2.37K |
| 501 µs | L = 1 in flight | 2K |
| 596 µs | L = 1 in flight | 1.68K |
| 708 µs | L = 1 in flight | 1.41K |
| 841 µs | L = 1 in flight | 1.19K |
| 1 ms | L = 1 in flight | 1K |
| 1.19 ms | L = 1 in flight | 841 |
| 1.41 ms | L = 1 in flight | 708 |
| 1.68 ms | L = 1 in flight | 596 |
| 2 ms | L = 1 in flight | 501 |
| 2.37 ms | L = 1 in flight | 422 |
| 2.82 ms | L = 1 in flight | 355 |
| 3.35 ms | L = 1 in flight | 299 |
| 3.98 ms | L = 1 in flight | 251 |
| 4.73 ms | L = 1 in flight | 211 |
| 5.62 ms | L = 1 in flight | 178 |
| 6.68 ms | L = 1 in flight | 150 |
| 7.94 ms | L = 1 in flight | 126 |
| 9.44 ms | L = 1 in flight | 106 |
| 11.2 ms | L = 1 in flight | 89.1 |
| 13.3 ms | L = 1 in flight | 75 |
| 15.8 ms | L = 1 in flight | 63.1 |
| 18.8 ms | L = 1 in flight | 53.1 |
| 22.4 ms | L = 1 in flight | 44.7 |
| 26.6 ms | L = 1 in flight | 37.6 |
| 31.6 ms | L = 1 in flight | 31.6 |
| 37.6 ms | L = 1 in flight | 26.6 |
| 44.7 ms | L = 1 in flight | 22.4 |
| 53.1 ms | L = 1 in flight | 18.8 |
| 63.1 ms | L = 1 in flight | 15.8 |
| 75 ms | L = 1 in flight | 13.3 |
| 89.1 ms | L = 1 in flight | 11.2 |
| 106 ms | L = 1 in flight | 9.44 |
| 126 ms | L = 1 in flight | 7.94 |
| 150 ms | L = 1 in flight | 6.68 |
| 178 ms | L = 1 in flight | 5.62 |
| 211 ms | L = 1 in flight | 4.73 |
| 251 ms | L = 1 in flight | 3.98 |
| 299 ms | L = 1 in flight | 3.35 |
| 355 ms | L = 1 in flight | 2.82 |
| 422 ms | L = 1 in flight | 2.37 |
| 501 ms | L = 1 in flight | 2 |
| 596 ms | L = 1 in flight | 1.68 |
| 708 ms | L = 1 in flight | 1.41 |
| 841 ms | L = 1 in flight | 1.19 |
| 1 s | L = 1 in flight | 1 |
| 1 µs | L = 12 | 12M |
| 1.19 µs | L = 12 | 10.1M |
| 1.41 µs | L = 12 | 8.5M |
| 1.68 µs | L = 12 | 7.15M |
| 2 µs | L = 12 | 6.01M |
| 2.37 µs | L = 12 | 5.06M |
| 2.82 µs | L = 12 | 4.26M |
| 3.35 µs | L = 12 | 3.58M |
| 3.98 µs | L = 12 | 3.01M |
| 4.73 µs | L = 12 | 2.54M |
| 5.62 µs | L = 12 | 2.13M |
| 6.68 µs | L = 12 | 1.8M |
| 7.94 µs | L = 12 | 1.51M |
| 9.44 µs | L = 12 | 1.27M |
| 11.2 µs | L = 12 | 1.07M |
| 13.3 µs | L = 12 | 900K |
| 15.8 µs | L = 12 | 757K |
| 18.8 µs | L = 12 | 637K |
| 22.4 µs | L = 12 | 536K |
| 26.6 µs | L = 12 | 451K |
| 31.6 µs | L = 12 | 379K |
| 37.6 µs | L = 12 | 319K |
| 44.7 µs | L = 12 | 269K |
| 53.1 µs | L = 12 | 226K |
| 63.1 µs | L = 12 | 190K |
| 75 µs | L = 12 | 160K |
| 89.1 µs | L = 12 | 135K |
| 106 µs | L = 12 | 113K |
| 126 µs | L = 12 | 95.3K |
| 150 µs | L = 12 | 80.2K |
| 178 µs | L = 12 | 67.5K |
| 211 µs | L = 12 | 56.8K |
| 251 µs | L = 12 | 47.8K |
| 299 µs | L = 12 | 40.2K |
| 355 µs | L = 12 | 33.8K |
| 422 µs | L = 12 | 28.5K |
| 501 µs | L = 12 | 23.9K |
| 596 µs | L = 12 | 20.1K |
| 708 µs | L = 12 | 17K |
| 841 µs | L = 12 | 14.3K |
| 1 ms | L = 12 | 12K |
| 1.19 ms | L = 12 | 10.1K |
| 1.41 ms | L = 12 | 8.5K |
| 1.68 ms | L = 12 | 7.15K |
| 2 ms | L = 12 | 6.01K |
| 2.37 ms | L = 12 | 5.06K |
| 2.82 ms | L = 12 | 4.26K |
| 3.35 ms | L = 12 | 3.58K |
| 3.98 ms | L = 12 | 3.01K |
| 4.73 ms | L = 12 | 2.54K |
| 5.62 ms | L = 12 | 2.13K |
| 6.68 ms | L = 12 | 1.8K |
| 7.94 ms | L = 12 | 1.51K |
| 9.44 ms | L = 12 | 1.27K |
| 11.2 ms | L = 12 | 1.07K |
| 13.3 ms | L = 12 | 900 |
| 15.8 ms | L = 12 | 757 |
| 18.8 ms | L = 12 | 637 |
| 22.4 ms | L = 12 | 536 |
| 26.6 ms | L = 12 | 451 |
| 31.6 ms | L = 12 | 379 |
| 37.6 ms | L = 12 | 319 |
| 44.7 ms | L = 12 | 269 |
| 53.1 ms | L = 12 | 226 |
| 63.1 ms | L = 12 | 190 |
| 75 ms | L = 12 | 160 |
| 89.1 ms | L = 12 | 135 |
| 106 ms | L = 12 | 113 |
| 126 ms | L = 12 | 95.3 |
| 150 ms | L = 12 | 80.2 |
| 178 ms | L = 12 | 67.5 |
| 211 ms | L = 12 | 56.8 |
| 251 ms | L = 12 | 47.8 |
| 299 ms | L = 12 | 40.2 |
| 355 ms | L = 12 | 33.8 |
| 422 ms | L = 12 | 28.5 |
| 501 ms | L = 12 | 23.9 |
| 596 ms | L = 12 | 20.1 |
| 708 ms | L = 12 | 17 |
| 841 ms | L = 12 | 14.3 |
| 1 s | L = 12 | 12 |
| 1 µs | L = 80 | 80M |
| 1.19 µs | L = 80 | 67.3M |
| 1.41 µs | L = 80 | 56.6M |
| 1.68 µs | L = 80 | 47.7M |
| 2 µs | L = 80 | 40.1M |
| 2.37 µs | L = 80 | 33.7M |
| 2.82 µs | L = 80 | 28.4M |
| 3.35 µs | L = 80 | 23.9M |
| 3.98 µs | L = 80 | 20.1M |
| 4.73 µs | L = 80 | 16.9M |
| 5.62 µs | L = 80 | 14.2M |
| 6.68 µs | L = 80 | 12M |
| 7.94 µs | L = 80 | 10.1M |
| 9.44 µs | L = 80 | 8.47M |
| 11.2 µs | L = 80 | 7.13M |
| 13.3 µs | L = 80 | 6M |
| 15.8 µs | L = 80 | 5.05M |
| 18.8 µs | L = 80 | 4.25M |
| 22.4 µs | L = 80 | 3.57M |
| 26.6 µs | L = 80 | 3.01M |
| 31.6 µs | L = 80 | 2.53M |
| 37.6 µs | L = 80 | 2.13M |
| 44.7 µs | L = 80 | 1.79M |
| 53.1 µs | L = 80 | 1.51M |
| 63.1 µs | L = 80 | 1.27M |
| 75 µs | L = 80 | 1.07M |
| 89.1 µs | L = 80 | 898K |
| 106 µs | L = 80 | 755K |
| 126 µs | L = 80 | 635K |
| 150 µs | L = 80 | 535K |
| 178 µs | L = 80 | 450K |
| 211 µs | L = 80 | 379K |
| 251 µs | L = 80 | 318K |
| 299 µs | L = 80 | 268K |
| 355 µs | L = 80 | 225K |
| 422 µs | L = 80 | 190K |
| 501 µs | L = 80 | 160K |
| 596 µs | L = 80 | 134K |
| 708 µs | L = 80 | 113K |
| 841 µs | L = 80 | 95.1K |
| 1 ms | L = 80 | 80K |
| 1.19 ms | L = 80 | 67.3K |
| 1.41 ms | L = 80 | 56.6K |
| 1.68 ms | L = 80 | 47.7K |
| 2 ms | L = 80 | 40.1K |
| 2.37 ms | L = 80 | 33.7K |
| 2.82 ms | L = 80 | 28.4K |
| 3.35 ms | L = 80 | 23.9K |
| 3.98 ms | L = 80 | 20.1K |
| 4.73 ms | L = 80 | 16.9K |
| 5.62 ms | L = 80 | 14.2K |
| 6.68 ms | L = 80 | 12K |
| 7.94 ms | L = 80 | 10.1K |
| 9.44 ms | L = 80 | 8.47K |
| 11.2 ms | L = 80 | 7.13K |
| 13.3 ms | L = 80 | 6K |
| 15.8 ms | L = 80 | 5.05K |
| 18.8 ms | L = 80 | 4.25K |
| 22.4 ms | L = 80 | 3.57K |
| 26.6 ms | L = 80 | 3.01K |
| 31.6 ms | L = 80 | 2.53K |
| 37.6 ms | L = 80 | 2.13K |
| 44.7 ms | L = 80 | 1.79K |
| 53.1 ms | L = 80 | 1.51K |
| 63.1 ms | L = 80 | 1.27K |
| 75 ms | L = 80 | 1.07K |
| 89.1 ms | L = 80 | 898 |
| 106 ms | L = 80 | 755 |
| 126 ms | L = 80 | 635 |
| 150 ms | L = 80 | 535 |
| 178 ms | L = 80 | 450 |
| 211 ms | L = 80 | 379 |
| 251 ms | L = 80 | 318 |
| 299 ms | L = 80 | 268 |
| 355 ms | L = 80 | 225 |
| 422 ms | L = 80 | 190 |
| 501 ms | L = 80 | 160 |
| 596 ms | L = 80 | 134 |
| 708 ms | L = 80 | 113 |
| 841 ms | L = 80 | 95.1 |
| 1 s | L = 80 | 80 |
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
| Where | Form |
|---|---|
| NVMe queue depth | IOPS = QD ÷ latency |
| Memory-level parallelism | bandwidth = outstanding misses × 64 B ÷ 80 ns |
| Bandwidth-delay product | in-flight = bandwidth × RTT |
| Here | L = λ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% utilization 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 = arrival rate × average service time.
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
| Utilization ρ | Response time R (× S) |
|---|---|
| 0 | 1× |
| 0.012 | 1.01× |
| 0.025 | 1.03× |
| 0.037 | 1.04× |
| 0.049 | 1.05× |
| 0.061 | 1.07× |
| 0.074 | 1.08× |
| 0.086 | 1.09× |
| 0.098 | 1.11× |
| 0.11 | 1.12× |
| 0.123 | 1.14× |
| 0.135 | 1.16× |
| 0.147 | 1.17× |
| 0.159 | 1.19× |
| 0.171 | 1.21× |
| 0.184 | 1.23× |
| 0.196 | 1.24× |
| 0.208 | 1.26× |
| 0.221 | 1.28× |
| 0.233 | 1.3× |
| 0.245 | 1.32× |
| 0.257 | 1.35× |
| 0.269 | 1.37× |
| 0.282 | 1.39× |
| 0.294 | 1.42× |
| 0.306 | 1.44× |
| 0.319 | 1.47× |
| 0.331 | 1.49× |
| 0.343 | 1.52× |
| 0.355 | 1.55× |
| 0.367 | 1.58× |
| 0.38 | 1.61× |
| 0.392 | 1.64× |
| 0.404 | 1.68× |
| 0.416 | 1.71× |
| 0.429 | 1.75× |
| 0.441 | 1.79× |
| 0.453 | 1.83× |
| 0.466 | 1.87× |
| 0.478 | 1.91× |
| 0.49 | 1.96× |
| 0.502 | 2.01× |
| 0.514 | 2.06× |
| 0.527 | 2.11× |
| 0.539 | 2.17× |
| 0.551 | 2.23× |
| 0.564 | 2.29× |
| 0.576 | 2.36× |
| 0.588 | 2.43× |
| 0.6 | 2.5× |
| 0.613 | 2.58× |
| 0.625 | 2.66× |
| 0.637 | 2.75× |
| 0.649 | 2.85× |
| 0.661 | 2.95× |
| 0.674 | 3.07× |
| 0.686 | 3.18× |
| 0.698 | 3.31× |
| 0.71 | 3.45× |
| 0.723 | 3.61× |
| 0.735 | 3.77× |
| 0.747 | 3.96× |
| 0.759 | 4.16× |
| 0.772 | 4.38× |
| 0.784 | 4.63× |
| 0.796 | 4.91× |
| 0.808 | 5.22× |
| 0.821 | 5.58× |
| 0.833 | 5.99× |
| 0.845 | 6.46× |
| 0.857 | 7.02× |
| 0.87 | 7.68× |
| 0.882 | 8.47× |
| 0.894 | 9.46× |
| 0.906 | 10.7× |
| 0.919 | 12.3× |
| 0.931 | 14.5× |
| 0.943 | 17.6× |
| 0.956 | 22.5× |
| 0.968 | 31× |
| 0.98 | 50× |
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.95 | 20 × 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
Data table
| Utilization ρ | series | Waiting time Wq (× S) |
|---|---|---|
| 0.012 | cₛ² = 1 (steady) | 0.012× |
| 0.024 | cₛ² = 1 (steady) | 0.024× |
| 0.036 | cₛ² = 1 (steady) | 0.037× |
| 0.048 | cₛ² = 1 (steady) | 0.05× |
| 0.059 | cₛ² = 1 (steady) | 0.063× |
| 0.071 | cₛ² = 1 (steady) | 0.077× |
| 0.083 | cₛ² = 1 (steady) | 0.091× |
| 0.095 | cₛ² = 1 (steady) | 0.105× |
| 0.107 | cₛ² = 1 (steady) | 0.12× |
| 0.119 | cₛ² = 1 (steady) | 0.135× |
| 0.131 | cₛ² = 1 (steady) | 0.15× |
| 0.142 | cₛ² = 1 (steady) | 0.166× |
| 0.154 | cₛ² = 1 (steady) | 0.183× |
| 0.166 | cₛ² = 1 (steady) | 0.199× |
| 0.178 | cₛ² = 1 (steady) | 0.217× |
| 0.19 | cₛ² = 1 (steady) | 0.235× |
| 0.202 | cₛ² = 1 (steady) | 0.253× |
| 0.214 | cₛ² = 1 (steady) | 0.272× |
| 0.226 | cₛ² = 1 (steady) | 0.291× |
| 0.237 | cₛ² = 1 (steady) | 0.311× |
| 0.249 | cₛ² = 1 (steady) | 0.332× |
| 0.261 | cₛ² = 1 (steady) | 0.354× |
| 0.273 | cₛ² = 1 (steady) | 0.376× |
| 0.285 | cₛ² = 1 (steady) | 0.399× |
| 0.297 | cₛ² = 1 (steady) | 0.422× |
| 0.309 | cₛ² = 1 (steady) | 0.447× |
| 0.321 | cₛ² = 1 (steady) | 0.472× |
| 0.332 | cₛ² = 1 (steady) | 0.498× |
| 0.344 | cₛ² = 1 (steady) | 0.525× |
| 0.356 | cₛ² = 1 (steady) | 0.553× |
| 0.368 | cₛ² = 1 (steady) | 0.583× |
| 0.38 | cₛ² = 1 (steady) | 0.613× |
| 0.392 | cₛ² = 1 (steady) | 0.644× |
| 0.404 | cₛ² = 1 (steady) | 0.677× |
| 0.416 | cₛ² = 1 (steady) | 0.711× |
| 0.427 | cₛ² = 1 (steady) | 0.747× |
| 0.439 | cₛ² = 1 (steady) | 0.784× |
| 0.451 | cₛ² = 1 (steady) | 0.822× |
| 0.463 | cₛ² = 1 (steady) | 0.863× |
| 0.475 | cₛ² = 1 (steady) | 0.905× |
| 0.487 | cₛ² = 1 (steady) | 0.949× |
| 0.499 | cₛ² = 1 (steady) | 0.995× |
| 0.511 | cₛ² = 1 (steady) | 1.04× |
| 0.522 | cₛ² = 1 (steady) | 1.09× |
| 0.534 | cₛ² = 1 (steady) | 1.15× |
| 0.546 | cₛ² = 1 (steady) | 1.2× |
| 0.558 | cₛ² = 1 (steady) | 1.26× |
| 0.57 | cₛ² = 1 (steady) | 1.33× |
| 0.582 | cₛ² = 1 (steady) | 1.39× |
| 0.594 | cₛ² = 1 (steady) | 1.46× |
| 0.606 | cₛ² = 1 (steady) | 1.54× |
| 0.617 | cₛ² = 1 (steady) | 1.61× |
| 0.629 | cₛ² = 1 (steady) | 1.7× |
| 0.641 | cₛ² = 1 (steady) | 1.79× |
| 0.653 | cₛ² = 1 (steady) | 1.88× |
| 0.665 | cₛ² = 1 (steady) | 1.99× |
| 0.677 | cₛ² = 1 (steady) | 2.09× |
| 0.689 | cₛ² = 1 (steady) | 2.21× |
| 0.701 | cₛ² = 1 (steady) | 2.34× |
| 0.713 | cₛ² = 1 (steady) | 2.48× |
| 0.724 | cₛ² = 1 (steady) | 2.63× |
| 0.736 | cₛ² = 1 (steady) | 2.79× |
| 0.748 | cₛ² = 1 (steady) | 2.97× |
| 0.76 | cₛ² = 1 (steady) | 3.17× |
| 0.772 | cₛ² = 1 (steady) | 3.38× |
| 0.784 | cₛ² = 1 (steady) | 3.62× |
| 0.796 | cₛ² = 1 (steady) | 3.89× |
| 0.807 | cₛ² = 1 (steady) | 4.19× |
| 0.819 | cₛ² = 1 (steady) | 4.54× |
| 0.831 | cₛ² = 1 (steady) | 4.93× |
| 0.843 | cₛ² = 1 (steady) | 5.37× |
| 0.855 | cₛ² = 1 (steady) | 5.9× |
| 0.867 | cₛ² = 1 (steady) | 6.51× |
| 0.879 | cₛ² = 1 (steady) | 7.25× |
| 0.891 | cₛ² = 1 (steady) | 8.14× |
| 0.903 | cₛ² = 1 (steady) | 9.26× |
| 0.914 | cₛ² = 1 (steady) | 10.7× |
| 0.926 | cₛ² = 1 (steady) | 12.6× |
| 0.938 | cₛ² = 1 (steady) | 15.2× |
| 0.95 | cₛ² = 1 (steady) | 19× |
| 0.012 | cₛ² = 4 | 0.03× |
| 0.024 | cₛ² = 4 | 0.061× |
| 0.036 | cₛ² = 4 | 0.092× |
| 0.048 | cₛ² = 4 | 0.125× |
| 0.059 | cₛ² = 4 | 0.158× |
| 0.071 | cₛ² = 4 | 0.192× |
| 0.083 | cₛ² = 4 | 0.227× |
| 0.095 | cₛ² = 4 | 0.262× |
| 0.107 | cₛ² = 4 | 0.299× |
| 0.119 | cₛ² = 4 | 0.337× |
| 0.131 | cₛ² = 4 | 0.376× |
| 0.142 | cₛ² = 4 | 0.415× |
| 0.154 | cₛ² = 4 | 0.456× |
| 0.166 | cₛ² = 4 | 0.499× |
| 0.178 | cₛ² = 4 | 0.542× |
| 0.19 | cₛ² = 4 | 0.586× |
| 0.202 | cₛ² = 4 | 0.632× |
| 0.214 | cₛ² = 4 | 0.68× |
| 0.226 | cₛ² = 4 | 0.728× |
| 0.237 | cₛ² = 4 | 0.779× |
| 0.249 | cₛ² = 4 | 0.831× |
| 0.261 | cₛ² = 4 | 0.884× |
| 0.273 | cₛ² = 4 | 0.939× |
| 0.285 | cₛ² = 4 | 0.997× |
| 0.297 | cₛ² = 4 | 1.06× |
| 0.309 | cₛ² = 4 | 1.12× |
| 0.321 | cₛ² = 4 | 1.18× |
| 0.332 | cₛ² = 4 | 1.25× |
| 0.344 | cₛ² = 4 | 1.31× |
| 0.356 | cₛ² = 4 | 1.38× |
| 0.368 | cₛ² = 4 | 1.46× |
| 0.38 | cₛ² = 4 | 1.53× |
| 0.392 | cₛ² = 4 | 1.61× |
| 0.404 | cₛ² = 4 | 1.69× |
| 0.416 | cₛ² = 4 | 1.78× |
| 0.427 | cₛ² = 4 | 1.87× |
| 0.439 | cₛ² = 4 | 1.96× |
| 0.451 | cₛ² = 4 | 2.06× |
| 0.463 | cₛ² = 4 | 2.16× |
| 0.475 | cₛ² = 4 | 2.26× |
| 0.487 | cₛ² = 4 | 2.37× |
| 0.499 | cₛ² = 4 | 2.49× |
| 0.511 | cₛ² = 4 | 2.61× |
| 0.522 | cₛ² = 4 | 2.74× |
| 0.534 | cₛ² = 4 | 2.87× |
| 0.546 | cₛ² = 4 | 3.01× |
| 0.558 | cₛ² = 4 | 3.16× |
| 0.57 | cₛ² = 4 | 3.31× |
| 0.582 | cₛ² = 4 | 3.48× |
| 0.594 | cₛ² = 4 | 3.65× |
| 0.606 | cₛ² = 4 | 3.84× |
| 0.617 | cₛ² = 4 | 4.04× |
| 0.629 | cₛ² = 4 | 4.25× |
| 0.641 | cₛ² = 4 | 4.47× |
| 0.653 | cₛ² = 4 | 4.71× |
| 0.665 | cₛ² = 4 | 4.96× |
| 0.677 | cₛ² = 4 | 5.24× |
| 0.689 | cₛ² = 4 | 5.53× |
| 0.701 | cₛ² = 4 | 5.85× |
| 0.713 | cₛ² = 4 | 6.2× |
| 0.724 | cₛ² = 4 | 6.57× |
| 0.736 | cₛ² = 4 | 6.98× |
| 0.748 | cₛ² = 4 | 7.43× |
| 0.76 | cₛ² = 4 | 7.92× |
| 0.772 | cₛ² = 4 | 8.46× |
| 0.784 | cₛ² = 4 | 9.06× |
| 0.796 | cₛ² = 4 | 9.73× |
| 0.807 | cₛ² = 4 | 10.5× |
| 0.819 | cₛ² = 4 | 11.3× |
| 0.831 | cₛ² = 4 | 12.3× |
| 0.843 | cₛ² = 4 | 13.4× |
| 0.855 | cₛ² = 4 | 14.7× |
| 0.867 | cₛ² = 4 | 16.3× |
| 0.879 | cₛ² = 4 | 18.1× |
| 0.891 | cₛ² = 4 | 20.4× |
| 0.903 | cₛ² = 4 | 23.1× |
| 0.914 | cₛ² = 4 | 26.7× |
| 0.926 | cₛ² = 4 | 31.4× |
| 0.938 | cₛ² = 4 | 37.9× |
| 0.95 | cₛ² = 4 | 47.5× |
| 0.012 | cₛ² = 19 (a few very slow requests) | 0.12× |
| 0.024 | cₛ² = 19 (a few very slow requests) | 0.243× |
| 0.036 | cₛ² = 19 (a few very slow requests) | 0.369× |
| 0.048 | cₛ² = 19 (a few very slow requests) | 0.499× |
| 0.059 | cₛ² = 19 (a few very slow requests) | 0.631× |
| 0.071 | cₛ² = 19 (a few very slow requests) | 0.767× |
| 0.083 | cₛ² = 19 (a few very slow requests) | 0.907× |
| 0.095 | cₛ² = 19 (a few very slow requests) | 1.05× |
| 0.107 | cₛ² = 19 (a few very slow requests) | 1.2× |
| 0.119 | cₛ² = 19 (a few very slow requests) | 1.35× |
| 0.131 | cₛ² = 19 (a few very slow requests) | 1.5× |
| 0.142 | cₛ² = 19 (a few very slow requests) | 1.66× |
| 0.154 | cₛ² = 19 (a few very slow requests) | 1.83× |
| 0.166 | cₛ² = 19 (a few very slow requests) | 1.99× |
| 0.178 | cₛ² = 19 (a few very slow requests) | 2.17× |
| 0.19 | cₛ² = 19 (a few very slow requests) | 2.35× |
| 0.202 | cₛ² = 19 (a few very slow requests) | 2.53× |
| 0.214 | cₛ² = 19 (a few very slow requests) | 2.72× |
| 0.226 | cₛ² = 19 (a few very slow requests) | 2.91× |
| 0.237 | cₛ² = 19 (a few very slow requests) | 3.11× |
| 0.249 | cₛ² = 19 (a few very slow requests) | 3.32× |
| 0.261 | cₛ² = 19 (a few very slow requests) | 3.54× |
| 0.273 | cₛ² = 19 (a few very slow requests) | 3.76× |
| 0.285 | cₛ² = 19 (a few very slow requests) | 3.99× |
| 0.297 | cₛ² = 19 (a few very slow requests) | 4.22× |
| 0.309 | cₛ² = 19 (a few very slow requests) | 4.47× |
| 0.321 | cₛ² = 19 (a few very slow requests) | 4.72× |
| 0.332 | cₛ² = 19 (a few very slow requests) | 4.98× |
| 0.344 | cₛ² = 19 (a few very slow requests) | 5.25× |
| 0.356 | cₛ² = 19 (a few very slow requests) | 5.53× |
| 0.368 | cₛ² = 19 (a few very slow requests) | 5.83× |
| 0.38 | cₛ² = 19 (a few very slow requests) | 6.13× |
| 0.392 | cₛ² = 19 (a few very slow requests) | 6.44× |
| 0.404 | cₛ² = 19 (a few very slow requests) | 6.77× |
| 0.416 | cₛ² = 19 (a few very slow requests) | 7.11× |
| 0.427 | cₛ² = 19 (a few very slow requests) | 7.47× |
| 0.439 | cₛ² = 19 (a few very slow requests) | 7.84× |
| 0.451 | cₛ² = 19 (a few very slow requests) | 8.22× |
| 0.463 | cₛ² = 19 (a few very slow requests) | 8.63× |
| 0.475 | cₛ² = 19 (a few very slow requests) | 9.05× |
| 0.487 | cₛ² = 19 (a few very slow requests) | 9.49× |
| 0.499 | cₛ² = 19 (a few very slow requests) | 9.95× |
| 0.511 | cₛ² = 19 (a few very slow requests) | 10.4× |
| 0.522 | cₛ² = 19 (a few very slow requests) | 10.9× |
| 0.534 | cₛ² = 19 (a few very slow requests) | 11.5× |
| 0.546 | cₛ² = 19 (a few very slow requests) | 12× |
| 0.558 | cₛ² = 19 (a few very slow requests) | 12.6× |
| 0.57 | cₛ² = 19 (a few very slow requests) | 13.3× |
| 0.582 | cₛ² = 19 (a few very slow requests) | 13.9× |
| 0.594 | cₛ² = 19 (a few very slow requests) | 14.6× |
| 0.606 | cₛ² = 19 (a few very slow requests) | 15.4× |
| 0.617 | cₛ² = 19 (a few very slow requests) | 16.1× |
| 0.629 | cₛ² = 19 (a few very slow requests) | 17× |
| 0.641 | cₛ² = 19 (a few very slow requests) | 17.9× |
| 0.653 | cₛ² = 19 (a few very slow requests) | 18.8× |
| 0.665 | cₛ² = 19 (a few very slow requests) | 19.9× |
| 0.677 | cₛ² = 19 (a few very slow requests) | 20.9× |
| 0.689 | cₛ² = 19 (a few very slow requests) | 22.1× |
| 0.701 | cₛ² = 19 (a few very slow requests) | 23.4× |
| 0.713 | cₛ² = 19 (a few very slow requests) | 24.8× |
| 0.724 | cₛ² = 19 (a few very slow requests) | 26.3× |
| 0.736 | cₛ² = 19 (a few very slow requests) | 27.9× |
| 0.748 | cₛ² = 19 (a few very slow requests) | 29.7× |
| 0.76 | cₛ² = 19 (a few very slow requests) | 31.7× |
| 0.772 | cₛ² = 19 (a few very slow requests) | 33.8× |
| 0.784 | cₛ² = 19 (a few very slow requests) | 36.2× |
| 0.796 | cₛ² = 19 (a few very slow requests) | 38.9× |
| 0.807 | cₛ² = 19 (a few very slow requests) | 41.9× |
| 0.819 | cₛ² = 19 (a few very slow requests) | 45.4× |
| 0.831 | cₛ² = 19 (a few very slow requests) | 49.3× |
| 0.843 | cₛ² = 19 (a few very slow requests) | 53.7× |
| 0.855 | cₛ² = 19 (a few very slow requests) | 59× |
| 0.867 | cₛ² = 19 (a few very slow requests) | 65.1× |
| 0.879 | cₛ² = 19 (a few very slow requests) | 72.5× |
| 0.891 | cₛ² = 19 (a few very slow requests) | 81.4× |
| 0.903 | cₛ² = 19 (a few very slow requests) | 92.6× |
| 0.914 | cₛ² = 19 (a few very slow requests) | 107× |
| 0.926 | cₛ² = 19 (a few very slow requests) | 126× |
| 0.938 | cₛ² = 19 (a few very slow requests) | 152× |
| 0.95 | cₛ² = 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.
- Utilization is not a health metric. 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. Load shedding is how you refuse to operate beyond the knee.
-
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."