advanced
2 min answer
A team must load test at 10× normal traffic and a scaled-down environment tells them nothing. How is load testing in production done safely, and what does it find that nothing else does?
Show the full answer Hide the answer
Why the scaled-down environment is not enough
Failures at 10× are emergent — they arise from interactions that do not exist at 1×:
- Connection and thread pool limits, which are absolute numbers rather than proportions.
- Lock contention, which grows non-linearly with concurrency.
- Cache eviction behaviour, where a working set that fits at normal load does not at peak, so hit rate collapses and the origin receives a step change in load.
- Third-party rate limits, which are fixed regardless of your scale.
- Database plan changes at larger data volumes.
- Queueing effects, where queue length grows as ρ/(1−ρ) so the system is fine, fine, then collapses.
A tenth-scale environment reproduces none of these, because each depends on an absolute threshold rather than a ratio. It tells you the code works, which you already knew.
Doing it in production safely
- Tag synthetic traffic explicitly, propagated through every hop, so that every system can identify it.
- Route synthetic writes to shadow tables or a shadow tenant, and exclude synthetic traffic from analytics, billing, machine-learning training data, and downstream side effects. The last group is where the damage happens: emails, payments, notifications, inventory decrements.
- Ramp gradually with an abort threshold on real-user error rate and latency. Real traffic must always win, and the test must stop automatically when it does not.
- A tested kill switch for the load generator, exercised before the test begins.
- Run during business hours with the team present — running at 3am to minimise impact also means the people who understand the system are asleep, which inverts the purpose.
- Announce it, so that an unrelated incident during the window is not misattributed and so that nobody responds to expected alerts.
- Test the whole journey, not individual services, since the failure will be an interaction — a cache-miss storm producing database saturation producing a retry cascade.
- Use realistic traffic shape, replayed or generated from real distributions. Uniform synthetic load tests a system nobody operates.
The iteration that matters
Every load test finds one bottleneck; removing it reveals the next. The useful measure of preparation is how many iterations were completed, not the peak achieved once.
Teams that stop at the first successful run have found the first constraint and confirmed nothing about the second — and the second is what fails on the day.
What it finds that nothing else does
- The actual capacity number, rather than an extrapolation.
- Which dependency saturates first, which is frequently a surprise and frequently a third party.
- The behaviour above capacity — does it degrade, shed, queue unboundedly, or cascade? This is the most valuable finding and the least testable elsewhere.
- Whether the degradation ladder works, and how much capacity each rung actually releases — teams routinely find the rung they assumed was most valuable frees almost nothing.
- Whether the observability holds up at volume, since dashboards and telemetry pipelines have their own capacity limits and frequently fail at exactly the moment they are needed.