Definition · Offered load, and the M/M/s queueM/M/s is the M/M/1 model with s identical servers behind one queue. The offered load a = λ/μ is measured in servers: it is how many servers the work would keep permanently busy. The per-server utilisation is ρ = a/s, and the system settles when ρ < 1. The server count on this path is always s.
Definition · Erlang C, statedThe probability that an arrival has to wait at all is C(s,a) = [a^s/(s!(1 − ρ))] ÷ [Σ_(n<s) aⁿ/n! + a^s/(s!(1 − ρ))].
From it, L_q = C(s,a)·ρ/(1 − ρ) and W_q = L_q/λ by Little's Law. The derivation is not given here: it is Operations Research, markov-chains-decisions-and-queues/multiple-servers-and-erlang-c, and this course's list of what it does not cover says the same.
At s = 1 the formula collapses to C = ρ and the single-server results of “The M/M/1 Queue”, which is the check worth doing first on any implementation of it.
λ = 3 / s μ = 1 / s per server s = 4
a = λ/μ = 3 servers' worth of work ρ = a/s = 3/4
pooled M/M/4 C(4, 3) = 27/53 ≈ 0.5094 the chance of waiting at all
L_q = (27/53)(3) = 81/53 ≈ 1.528
W_q = L_q/λ = 27/53 ≈ 0.5094 s
four separate M/M/1 queues, λ/4 = 3/4 each, same ρ = 3/4
L_q = ρ²/(1 − ρ) = 9/4 per queue
W_q = L_q/(3/4) = 3 s
3 ÷ 27/53 = 53/9 ≈ 5.9 the cost of splitting the traffic
Nearly six times the wait, for the same machines under the same load. The split system is not overloaded and is not misconfigured; it is simply wasting the moments when one of its servers is free and one of its queues is not.
How the advantage moves with load
Pooling saves more seconds as the system gets busier and a larger multiple of the wait when it is quiet, and both halves of that are worth carrying. At ρ = 1/2 the pooled queue waits 2/23 of a second against 1 second separate — a ratio of 23/2 but a saving of under a second. At ρ = 3/4 the ratio is 53/9 and the saving is about two and a half seconds. At ρ = 9/10 the pooled wait is 4374/2221 against 9, a ratio of about 4.6 and a saving of about seven seconds.
So the headline “pooling matters most under load” is true of the seconds and false of the ratio, and it is the seconds that show up in an incident. The lab prints both rows at whatever λ, μ and s you set, so the two readings can be compared directly rather than argued about.
Pooling is not free, and the costs are real ones rather than rounding. A shared queue needs a dispatcher, which is a component that can itself queue or fail. Work that is not interchangeable — a session pinned to a server, a cache warmed for one shard — loses locality when it is pooled, and that shows up as a larger S, which the previous lesson says is multiplied by everything. The question is whether the factor gained on waiting exceeds the factor lost on service.
The same argument explains why a few large machines usually beat many small ones at the same total capacity, why a shared thread pool beats a pool per endpoint, and why sharding a workload that does not need to be sharded is a latency decision as well as a data one — which is where Partitioning and Load Balancing picks it up.