Capacity & Load Testing
How much can this system take, how much headroom is left, and which load-test shape answers the question you actually have? Everything here is arithmetic on your assumptions — label it that way when you present it.
Capacity planner
Every output below is derived from the inputs you set. It assumes work distributes evenly, that per-request cost stays constant as load rises (it does not — contention grows), and that CPU is the binding constraint. Use it to size a starting point and to notice when an assumption is absurd, then validate with a load test.
- • At 60% target utilisation you are buying 40% headroom. That is a defensible middle: enough slack to absorb a spike without paying for double the fleet.
- • 288 concurrent requests is the number every pool, thread count and connection limit on this path must exceed. If your database pool is smaller than this, the pool is your real capacity limit, not the CPU.
- • This sizes for a peak of 3× average. Measure that multiplier from a real peak — teams routinely under-estimate it, and the cost of being wrong is asymmetric.
- • Instances are sized on CPU alone. If the service is I/O-bound, CPU will never be the constraint and this number is meaningless — size on concurrency instead.
Load-test shapes
Each shape answers a different question, and each is blind to what the others find.
Increase load in steps and hold each step long enough to reach steady state. 100 → 500 → 1k → 5k → 10k req/s.
Where the knee is: the load at which latency stops being flat and starts climbing. This is the number capacity planning actually needs.
Anything that only appears over hours (leaks, disk fill, cache drift) and anything caused by a sudden change rather than a level.