What Little's Law says
Little's Law is one of the most useful results in all of queueing theory, and one of the simplest: the average number of items in a stable system equals the average arrival rate multiplied by the average time each item spends in the system.
L = λ × W
What makes it remarkable is how few assumptions it needs. It does not care about the arrival pattern, the service-time distribution, the number of servers, or the queueing discipline. As long as the system is stable — nothing is piling up without bound — the relationship holds exactly. That generality is why it turns up everywhere from factory floors to web-service capacity planning.
Reading it three ways
Because any one of the three quantities follows from the other two, the same formula answers three different questions:
- How many in flight? A service handling 100 requests per second, each taking 250 ms, has L = 100 × 0.25 = 25 requests in flight at any instant — so a thread pool or connection pool smaller than 25 will bottleneck.
- How long is the wait? If 50 jobs sit in a queue that drains at 200 per second, each new job waits W = 50 / 200 = 0.25 s before it clears.
- What throughput? If you observe 12 orders in progress and each takes 3 seconds, the line is completing λ = 12 / 3 = 4 orders per second.
The M/M/1 hockey stick
Little's Law tells you the average, but not how bad the tail gets. For that you need a queueing model. The M/M/1 model — one server, random (Poisson) arrivals, random (exponential) service — shows the effect every capacity planner learns to fear: waiting time does not rise gently as you load a system, it explodes near full utilization.
| Utilization ρ | Avg wait Wq (in service times) |
|---|---|
| 50% | 1.0× |
| 80% | 4.0× |
| 90% | 9.0× |
| 95% | 19.0× |
| 99% | 99.0× |
At 90% utilization a request already waits nine times its own service time just to get started. This is why running servers, disks, or pools "hot" to save money backfires: the last few percent of utilization cost enormous latency. Aim to keep steady-state utilization in the 70–80% range and leave the rest for bursts.
Related tools: the Erlang C calculator extends this to many servers (agents, threads, connections), and the data transfer time calculator covers the bandwidth side of throughput.