Definition · The M/M/s chainA birth-death chain with λₙ = λ for every n and μₙ = min(n, s)·μ, where μ is the rate of ONE server. Write a = λ/μ for the offered load and ρ = a/s for the utilisation per server.
An arriving customer waits when all s servers are busy, which is exactly when the system is in state s or above. That probability is Erlang C.
Two ratios and it is easy to use the wrong one. a = λ/μ is how much work arrives per unit time, measured in server-loads; it is 2 on the worked example whether there are two servers or five. ρ = a/s is the fraction of each server's time that work would occupy, and it is the one that has to be below 1 for an unbounded queue to settle.
λ = 2, μ = 1 (per server), s = 3 a = 2, ρ = a/s = 2/3
service rate out of state n: n = 1 → 1 n = 2 → 2
n = 3 → 3 n = 4 → 3 and 3 thereafter
cut ratios: 2/1, 2/2, 2/3, 2/3, 2/3, …
weights: 1, 2, 2, 4/3, 8/9, 16/27, …
π₀ = 0.111111 π₁ = 0.222222 π₂ = 0.222222
π₃ = 0.148148 π₄ = 0.098765 π₅ = 0.065844
P(wait) = π₃ + π₄ + π₅ + ⋯ = 44.444%
sysdesign_core.erlangC(2, 1, 3) = 4/9 = 44.444%
The two figures are computed from different things. The left one is a sum of entries of the truncated chain's π; the right one is the closed form for an unbounded M/M/s, 4/9 exactly. They agree to well under a millionth here, and the page prints a green tick when they do. On a chain kept too short for its load they will not, and the page will say so — which is the correct behaviour, because the disagreement is real and belongs to the truncation.
Pooling, at a fixed load
the same offered load a = 2, spread over more servers
servers ρ = a/s P(wait) Lq Wq each server busy
1 2 100.000% 38.00000 38.00000 100.00%
2 1 96.296% 18.29630 9.37975 97.53%
3 2/3 44.444% 0.88889 0.44444 66.67%
4 1/2 17.391% 0.17391 0.08696 50.00%
5 2/5 5.970% 0.03980 0.01990 40.00%
the offered load is 2 in every row, and the waiting collapses anyway
The third row is where the system becomes usable and the second is where it is not. At two servers ρ = 1 exactly: the work arriving equals the work the servers can do, the unbounded queue does not settle, and the only reason a finite Lq appears at all is the truncation at forty states. At three the utilisation is two thirds and the waiting probability has fallen by more than half. Nothing about the arrivals or the service changed between those rows.
Notice also the last column. Each server is busy 66.67% of the time at three servers and 40% at five, so the per-server utilisation falls as the waiting falls — which is the price of pooling and the reason it is a trade rather than a free lunch. “Many Servers: Pooling, and Erlang C” makes the same comparison from the closed forms; this page makes it from a distribution you can see.
The sentence that needed a condition
The expected number of busy servers is Σ min(n, s)πₙ, and on a queue that settles it equals the offered load a: every arriving customer is eventually served, so the work completed per unit time equals the work arriving, and adding a server does not change either. At a = 2 the busy count is 2.0000 at three servers, at four and at five.
Example · Where busy servers equals offered load stops being trueSet λ = 2, μ = 1 and one server. The offered load is still 2. The expected number of busy servers is 1.0 — it cannot exceed s = 1 — and the work the server finishes is 1 per unit time against the 2 arriving.
So “on average a's worth of work is being done, whatever s is” is false here, and this page used to print it without a condition. The banner now branches on ρ: below 1 it states the identity, and at ρ ≥ 1 it says instead that the servers cannot keep up, prints what they do finish, and notes that only the truncation stops the difference piling up without bound.
That correction is worth dwelling on, because the false version is more memorable than the true one and survives being half-remembered. The identity “throughput equals offered load” is a conservation statement about a system in equilibrium, and a system at ρ ≥ 1 has none; what it has is a backlog growing at λ − sμ per unit time, which “Transient Overload and Draining the Backlog” is about.
Example · Two servers at three quarters loadedWith λ = 3, μ = 2 and two servers the offered load is 3/2 and ρ = 3/4. The chain gives P(wait) = 64.285% and Lq = 1.928, and the closed form gives 64.286%.
The two differ by about three parts in a million, which is larger than the page's own agreement threshold, so it prints a disagreement here even though nothing is wrong: the chain is kept to forty states at a load whose tail decays like (3/4)ⁿ. The lesson is the one the preceding material made — a truncated chain is a different model — and the threshold is a property of this page rather than of the mathematics.