The Erlang B formula gives the fraction of Poisson arrivals rejected by a finite server pool with no waiting room. Derive blocking, carried load and the effect of adding capacity.
Erlang B formula
The Erlang B formula gives the long-run probability that an arriving request is rejected because every server is busy in a system with no waiting room. For a quant infrastructure team, it can translate a limit on simultaneous jobs or connections into an estimated rejection rate—provided the arrival and service assumptions fit. It measures loss at admission, rather than time spent waiting.
Capacity is an admission rule
Consider c identical servers. Each admitted request occupies one server until completion; an arrival finding all c occupied is lost immediately. The offered arrivals follow a constant-rate Poisson process with rate λ. Initially assume independent exponential holding times of mean 1/μ, independent of arrivals.
Define the offered load as
a=λ/μ=λE[S],
where S is a holding time. Use the same time unit in both rates. The product is dimensionless and is conventionally measured in Erlangs: it is the average simultaneous demand if every request could be admitted. It is neither the arrival rate nor the realised fraction of servers busy.
Under these assumptions, the blocking probability is
B(c,a)=k=0∑cak/k!ac/c!.
This is the M/M/c/c loss model: c servers and total system capacity c, including requests in service. There are no queue positions. Kelly and Yudovina, §1.3 derive this finite-capacity model.
Why the denominator stops at c
Let N count busy servers. It is a birth–death process on 0,1,…,c: accepted arrivals increase N at rate λ below capacity, while completions decrease it at rate kμ in state k.
The stationary detailed-balance equations give
πk−1λ=πkkμ⟹πk=π0k!ak,1≤k≤c.
Normalising over these states produces the denominator above. Thus B(c,a)=πc: Poisson arrivals see the time-average state distribution, the PASTA property. This equality concerns the state immediately before an offered arrival. A blocked arrival leaves N unchanged; it still counts in the rejection fraction. Without a Poisson input, arrival-seen congestion need not equal time-average congestion. Whitt's review makes this link explicit.
Three servers do not absorb every two-Erlang workload
A fictional computation service receives two requests per second. Each admitted request holds one worker for an independent exponential time averaging one second. There are three workers; rejected requests leave without retrying.
Here a=2 Erlangs. The stationary weights are 1,2,2,4/3, so
Although offered load is below total capacity, random overlaps still fill the pool. About one arrival in five is rejected in the long run under this model.
Fictional stationary loss system at offered load two Erlangs: with three servers, occupancy probabilities for zero through three busy servers are 15.79%, 31.58%, 31.58% and 21.05%. Blocking for one through six servers is 66.67%, 40.00%, 21.05%, 9.52%, 3.67% and 1.21%.
Original exact Erlang-B calculation. The top panel separates mean occupancy from the all-busy event; the bottom holds offered load fixed while capacity changes.
The carried load, or mean number of busy servers, is
E[N]=a[1−B(c,a)]=2(1−194)=1930≈1.579.
Consequently, average utilisation per server is E[N]/3=10/19≈52.63%, while the accepted request rate is λ(1−B)=30/19 requests per second. The two values 30/19 happen to coincide numerically because mean holding time is one second; their units differ. Averaging utilisation first and interpreting it as admission availability would miss the all-busy event.
Adding a fourth server at the same offered load gives B(4,2)=2/21≈9.52%. This is a model comparison, not a capacity recommendation: the acceptable loss rate and the cost of a rejected request belong to the application.
Compute recursively; keep the model boundary visible
Direct powers and factorials can overflow for large inputs. An equivalent recursion starts at B(0,a)=1 and updates
B(n,a)=n+aB(n−1,a)aB(n−1,a),n=1,…,c.
Each step adds one server. Tran-Gia and Hossfeld, §4.1 discuss this numerical form. Zero offered load gives zero blocking whenever at least one server exists.
The distinctions that matter in applying the result are:
Waiting changes the system. An M/M/c queue with unlimited waiting space uses Erlang C for the probability of a positive wait. With the example's rates and three servers, that probability is 4/9≈44.44%, rather than the loss system's 4/19. The additional queued requests change the stationary distribution. Neither number is a latency percentile.
Insensitivity has a precise scope. The stationary Erlang-B result extends to the standard M/G/c/c loss system with independent, identically distributed holding times of the same finite mean, independent of the Poisson arrivals. Exponential durations make the count-process derivation simple; they are not essential for the final blocking formula. This does not license changing the arrival process, adding retries, or introducing resource sharing. See Kelly and Yudovina, §2.7.
Use offered demand. Counting only accepted requests understates λ. Bursts, changing arrival rates, dependent job sizes, finite-source demand and correlated retries require additional modelling. A daily average plugged into a stationary formula does not establish peak-period rejection risk.
Frank Kelly and Elena Yudovina, Lecture Notes on Stochastic Networks, §1.3, Erlang's formula, finite-source contrast and mean carried traffic; §2.7, insensitivity.
Ward Whitt, Review of Birth-and-Death Queueing Models, Columbia IEOR 4615, 5 February 2015, slides 12 and 17: loss model, insensitivity, PASTA and the distinction between Erlang B and C.