HomeArticlesQueueing Theory

Queueing Theory: The Erlang-C Formula and Why Rho Approaching 1 Is a Cliff

How Poisson arrivals and exponential service times combine into the M/M/c queue, why utilisation near 100% is a trap, and what Little's Law gets you for free.

mysimulator teamUpdated June 2026≈ 8 min read▶ Open the simulation

A line that only theory can predict

Watch a queue for a while and it feels unpredictable -- sometimes empty, sometimes suddenly long, even when the average rate of people arriving and the average rate of being served both stay constant. Queueing theory explains that apparent randomness with two assumptions that turn out to model an enormous range of real systems well: arrivals follow a Poisson process (independent, memoryless, at some average rate lambda) and service times are exponentially distributed (average rate mu per open server). A system built on those two assumptions with c parallel servers is called an M/M/c queue in Kendall's notation -- the two M's stand for 'Markovian', shorthand for memoryless.

live demo · M/M/c queue length versus Erlang-C prediction● LIVE

Memorylessness is the surprising, load-bearing assumption: an exponential service time has no notion of 'almost done' -- the probability the next 30 seconds finishes the job is the same whether the job started 10 seconds ago or 10 minutes ago. That single property is what makes the whole system a Markov chain with a clean closed-form solution, instead of a system whose past history has to be tracked.

Utilisation and the wall at rho = 1

Define traffic intensity rho = lambda / (c · mu) -- the fraction of total service capacity actually being used. As long as rho stays below 1, the queue reaches a stable equilibrium where the average length and wait fluctuate around a finite value. As rho approaches 1 from below, queue length and waiting time both blow up, not linearly but roughly like 1 / (1 - rho): a queue at 80% utilisation is nowhere near twice as bad as one at 40%, it is dramatically worse, and a queue at 95% is worse again by a huge factor. This nonlinear cliff is why call centres, hospital triage and network routers are all deliberately run below full capacity -- 100% utilisation looks efficient on paper and is a queueing catastrophe in practice.

rho = lambda / (c · mu)              traffic intensity (utilisation), must stay < 1
Lq  ~ rho / (1 - rho)   for a single-server queue -- diverges as rho -> 1

Erlang-C: the exact formula behind call-centre staffing

For c servers, the exact probability that an arriving customer finds every server busy and has to wait -- rather than the single-server approximation above -- is given by the Erlang-C formula, published by Agner Krarup Erlang in 1917 for sizing Danish telephone exchanges and still the basis of call-centre staffing software today. From that waiting probability, standard relations (collectively Little's Law, L = lambda · W) convert straight into the average number waiting Lq and the average wait Wq.

Little's Law: the one formula that needs no assumptions at all

Independent of Poisson arrivals, exponential service, or any distribution at all, Little's Law states that the long-run average number of items in any stable system L equals the average arrival rate lambda times the average time an item spends in the system W: L = lambda · W. It holds for a supermarket checkout, a hospital ward, or packets in a router buffer, and its power is that it needs no model of the internal mechanics -- just count what goes in and how long things stay.

Why more, smaller queues are worse than one shared queue

A classic and counter-intuitive result: for the same total service capacity, one shared queue feeding c servers (like most modern call centres and airport security lines) always gives a shorter average wait than c separate single-server queues (like old-style supermarket checkout lines), because a single queue never lets one server sit idle while a customer waits behind a slow transaction at another. This is exactly why banks, post offices and airports switched from multiple parallel lines to a single serpentine line feeding whichever teller frees up next.

Frequently asked questions

What does M/M/c actually mean?

It is Kendall's notation for a queue with Poisson (Markovian) arrivals, exponential (Markovian) service times, and c parallel servers. Both M's refer to the memoryless property of the exponential distribution, which is what makes the queue's behavior solvable in closed form.

Why does a queue at 90% utilisation feel so much worse than one at 70%?

Because average queue length and wait time grow roughly like rho / (1 - rho), not linearly with utilisation rho. Going from 70% to 90% utilisation multiplies the denominator's shrinkage dramatically, so the wait grows far faster than the 20-point difference in utilisation would suggest.

Is it better to have one shared line or several separate lines for the same number of servers?

One shared line feeding all servers is provably better on average: it eliminates the situation where one server sits idle while a customer waits in a different line behind a slow transaction. This is why banks and airports moved to single serpentine queues instead of one line per counter.

Try it live

Everything above runs in your browser — open Queueing Theory and change the parameters while it is running. Nothing is installed, nothing is uploaded, the whole model lives in one tab.

▶ Open Queueing Theory simulation

What did you find?

Add reproduction steps (optional)