Calculator

Retry Amplification Calculator

Updated October 27, 2026•8 min read•Resilience•Retries

Written by

Reviewed by the LoadTester editorial team. Review process: see the editorial policy.

Published
2026-10-27
Last reviewed
2026-10-27
Author
Kristian Razum
Three service layers retrying 2, 3 and 3 times, fanning one user request out into 48 calls to a failing database

When several layers each retry failed calls, the worst-case load on the bottom dependency is the product of (1 + retries) across layers. A gateway with 2 retries, a service with 3 and a database client with 3 can turn one user request into 3 × 4 × 4 = 48 calls when the dependency is down, so 1,000 RPS of users becomes 48,000 RPS of attempts. The calculator below shows the worst case, the expected load at a given failure rate, and how much a retry budget caps it, layer by layer.

Worst-case amplification–
Expected at this failure rate–
Worst case with retry budget–
Bottom RPS: worst / with budget–
LayerRetriesMax attemptsWorst calls/reqExpected calls/reqWorst RPS out
Bottom failure rateExpected (no budget)Expected (with budget)

    

The amplification formulas

Number the layers from the top (closest to the user) to the bottom (the one calling the dependency that fails). Layer i makes up to 1 + ri attempts for each call it receives. Every attempt that reaches a lower layer can itself be retried there, so attempts multiply:

worst_case      = Π (1 + r_i)                       over all layers
bottom_RPS      = user_RPS × worst_case

expected, with independent failures (p = failure rate per attempt at the bottom):
  bottom layer:  E_n = (1 − p^(r_n + 1)) / (1 − p)      calls per invocation
                 f_n = p^(r_n + 1)                       chance the layer gives up
  layer above:   E_i = (1 − f_(i+1)^(r_i + 1)) / (1 − f_(i+1)),  f_i = f_(i+1)^(r_i + 1)
  amplification  = Π E_i

with a retry budget b per layer (retries ≤ b × requests):
  worst_case_b   = Π min(1 + r_i, 1 + b)
  expected_b     ≈ Π min(E_i, 1 + b)

The expected-value formula is a geometric series: a layer stops at the first success, so with failure probability q per call it makes 1 + q + q² + … + q^r calls on average. Multiplying the layers is valid because each layer's attempts are independent repetitions of the layer below (Wald's identity). The budget version is an approximation, since a budget also changes how often each layer gives up.

Worked example

The calculator's defaults: gateway with 2 retries, order service with 3, database client with 3, 1,000 user RPS.

  1. Worst case: (1 + 2) × (1 + 3) × (1 + 3) = 3 × 4 × 4 = 48. If the database is refusing every call, it receives 48,000 attempts per second while users still get errors.
  2. Expected at 50% failures: the DB client makes (1 − 0.5⁴) ÷ 0.5 = 1.875 calls on average and gives up 0.5⁴ = 6.25% of the time. The service above therefore sees 6.25% failures and makes (1 − 0.0625⁴) ÷ 0.9375 ≈ 1.067 calls. The gateway sees almost no failures. Total ≈ 1.875 × 1.067 × 1.000 = 2.0×.
  3. With a 10% budget: each layer can add at most 10% extra calls, so the worst case is 1.1³ = 1.33× instead of 48×.

The gap between 2× and 48× is the lesson. When failures are random and independent, retries at the bottom layer absorb them and the upper layers' retries rarely fire. When the dependency is hard down or overloaded, every attempt fails, and every layer's retries fire on every request.

Why real incidents look like the worst case

The independent-failure model is optimistic for one reason: overload makes failures correlated. A database at 100% CPU times out on most calls, not on a random few. Retries then add load to the component that is already saturated, which raises its failure rate further, which triggers more retries. That feedback loop is a retry storm, and it can keep a system down after the original trigger has gone. The retry storm troubleshooting guide covers how it shows up in metrics.

Use the sensitivity table in the calculator to see where your configuration turns dangerous. With the defaults, amplification stays near 2× until the bottom failure rate passes about 50%, then climbs steeply toward 48× as it approaches 100%.

Retry budgets and other controls

ControlEffect on amplificationNotes
Retry at one layer onlyWorst case = 1 + r of that layerUsually the layer closest to the failing dependency; upper layers fail fast
Retry budget (ratio)Each layer adds at most b extra loadThe Google SRE book describes a per-client budget that allows retries only while they are under 10% of requests
Per-request attempt capBounds r at each layerThe same chapter suggests at most three attempts per request
Exponential backoff with jitterSame number of attempts, spread over timePrevents synchronized bursts; does not reduce total work
Circuit breakerStops calls entirely while openTurns a slow failure into a fast one and gives the dependency room to recover
Do not retry overload signalsRemoves retries where they hurt mostRespect 429 and 503 with Retry-After; propagate "overloaded, don't retry" up the stack

Backoff deserves a specific warning, because it is often treated as the fix. Backoff changes when retries happen, not how many happen. Three retries with jittered backoff still multiply load by up to four during a long outage; they just arrive more smoothly.

Timeouts interact with retries too. If an upper layer times out and retries while the lower layer is still working on the first attempt, the system does the work twice. Keep timeouts shorter as you go down the stack, so the inner layer gives up before the outer layer retries.

Load testing retry behavior

A normal load test against a healthy system will never show retry amplification, because nothing fails. To see it:

  1. Measure attempts, not just requests. Export per-layer request counts, including retries, from each service's metrics. The ratio of downstream to upstream RPS is your observed amplification.
  2. Inject a failure during a steady load. Hold a constant arrival rate, then degrade the dependency: reduce database capacity, add latency, or make a stub return 503s. Watch the dependency's incoming RPS. In LoadTester you can add a deploy-style annotation at that moment so it lines up on the charts.
  3. Push past the knee. A stress test that runs above capacity shows whether the system recovers when load drops back, or whether retries keep it saturated.
  4. Hold the load constant. Use an arrival-rate (open) model. A closed VU model slows down as errors and latency rise, hiding exactly the amplification you want to see; see open vs closed workload models.

Retries also inflate the error budget burn when the dependency is down; the error budget calculator shows how quickly that adds up.

Checklist

  1. List every layer that retries, including SDKs, service meshes, gateways and client libraries with default retries.
  2. Enter them here and read the worst-case amplification.
  3. If it is above about 3×, keep retries at one layer and fail fast elsewhere.
  4. Add a retry budget or circuit breaker at each remaining retrying layer.
  5. Make timeouts shorter at inner layers than at outer ones.
  6. Run a constant-rate test with an injected dependency failure and measure downstream RPS.

FAQ

How do you calculate retry amplification?

Multiply (1 + retries) across every layer that retries. Three layers with 2, 3 and 3 retries give 3 x 4 x 4 = 48, so when the bottom dependency fails every call, it receives up to 48 attempts per user request.

Why does expected amplification look small but outages still cause retry storms?

The expected value assumes failures are random and independent, in which case the bottom layer's retries absorb most of them. During overload almost every call fails, so all layers retry on every request and the load approaches the worst case, which raises the failure rate further.

What is a retry budget?

A limit on retries as a share of requests rather than per request. The Google SRE book describes a per-client budget that only allows retries while they are under 10 percent of requests, so each layer can add at most about 10 percent extra load no matter how badly the dependency is failing.

Does exponential backoff prevent retry amplification?

No. Backoff with jitter spreads retries over time and prevents synchronized bursts, but the same number of attempts still happens during a long outage. To reduce the total, cap retries, retry at a single layer, use a retry budget or a circuit breaker.

Which layer should retry?

Usually only one, typically the layer closest to the dependency that fails, with the layers above failing fast. Inner timeouts should be shorter than outer ones so an outer retry does not start while the inner attempt is still running.

Run this as a real load testFree plan: 10 VUs, 50 RPS, live p95/p99 and error charts, no credit card. Starter $19/mo (250 VUs) or Pro $49/mo (2,000 VUs) with a 7-day free trial when you need more.
Start freeCompare plans