Live demo
The number you sized for is a six-week event.
90 days of hourly peak latency for five services, 2160 samples each. Everything below is a peaks-over-threshold fit computed in your browser: the shape parameter, the return levels, and the replica count that falls out of them.
Heavy tail. Events far worse than anything observed are not just possible, they are expected on a long enough horizon. Size for the return level, not the maximum.
A p99.9 taken over hourly samples is one hour in a thousand. That is an event every 42 days by definition, before any modelling. The fitted tail puts it at 23 d. Either way it is not a rare event, and it is the number the capacity plan is built on.
What it costs in machines
A shape parameter you have never computed is setting your replica count
Little’s Law: in-flight requests are arrival rate times time in system. At 3,200 requests per second and 120 concurrent slots per replica, latency converts directly into machines. Nothing here is a fudge factor.
The gap between 28 and 79 is not a safety-margin argument. It is the difference between provisioning for the worst hour you happened to sample and provisioning for the worst hour a year contains. Sizing at 28 does not mean the yearly hour will not happen; it means requests get shed when it does, and the post-incident review calls it unprecedented traffic.
ξ is doing the work
Same percentile, opposite futures
Five services, each with a p99.9 their owners quote in planning meetings. The percentile tells you nothing about which of them has a ceiling. The shape parameter does, and it splits them cleanly: two extrapolate hard, one barely moves, and one is already at its ceiling.
| Service | ξ | p99.9 | Worst hour | 1 in 365 d | Understated by | Verdict |
|---|---|---|---|---|---|---|
| checkout-api | 0.41 | 1.02s | 2.06s | 2.94s | 2.90× | Heavy. Size for the return level. |
| ledger-write | 0.33 | 707ms | 1.04s | 1.39s | 1.96× | Heavy. Size for the return level. |
| search-suggest | 0.17 | 471ms | 542ms | 720ms | 1.53× | Mild extrapolation, still real. |
| auth-token | 0.01 | 185ms | 202ms | 225ms | 1.21× | Exponential. The percentile is nearly right. |
| asset-edge | -0.26 | 115ms | 128ms | 122ms | 1.06× | Bounded. Already at the ceiling. |
Read the p99.9 column alone and asset-edge and checkout-api look like the same kind of problem at different scales. They are not. A negative ξ means a finite upper bound, and asset-edge has effectively already reached its. A positive ξ means there is no upper bound at all, and no amount of further observation will produce one.
The planning question
How bad does it get, and how many machines is that?
Pick a service and a horizon you are willing to be wrong on. The answer is a latency and a replica count, both derived from the fitted tail rather than from the worst thing you happened to record.
Sized off the p99.9 of the last quarter. Pages roughly monthly and nobody knows why.