Skip to content

Scalability test

A scalability test answers one question: “If I add more instances, does the system actually perform proportionally better?” It does not look for the breaking point. It checks that the architecture scales horizontally the way you designed it to.

  • You can control the number of replicas of the service under test (Kubernetes replicas, ECS tasks, VM count, etc.).
  • Your system passes a load test at your baseline VU count.
  • You can resize the environment and rerun the test without changing the test definition.

A scalability test runs the same fixed load profile (same VUs, same duration, same scenario) across multiple infrastructure configurations. Typical pattern:

RunReplicasExpected throughput (ideal linear scaling)
Run 1 (baseline)1RPS₁
Run 22~2 × RPS₁
Run 34~4 × RPS₁

If throughput doubles when replicas double, your architecture scales linearly. If throughput grows less than expected, something is a bottleneck: the database, a shared cache, the network, or a singleton component that does not scale out.

Scalability testing is also called scale-out validation or horizontal scaling verification.

ParameterValue
Virtual users (VUs)Enough to saturate the baseline (e.g., 200 VUs for 1-replica)
Duration15 min (same across all runs)
Ramp-up2–3 min (same across all runs)
Stop modeDuration
LocationsSame single location across all runs
  1. Create a test named api-scalability-baseline with your fixed load profile. Set the VU count high enough that the single-replica run is clearly constrained:

    execution:
    - executor: jmeter
    concurrency: 200
    ramp-up: 3m
    hold-for: 12m
    scenario: scale-check
    scenarios:
    scale-check:
    requests:
    - url: https://api.staging.example.com/v1/products
    label: list-products
  2. Run Run 1 with 1 replica deployed. Tag the run replicas=1.

  3. Scale your infrastructure to 2 replicas (e.g., kubectl scale deployment api --replicas=2).

  4. Run the same test again. Tag the run replicas=2.

  5. Scale to 4 replicas and run once more. Tag the run replicas=4.

  6. Use MaxoPerf’s run comparison to put Run 1 and Run 2 side by side and check the throughput and latency deltas.

In MaxoPerf, open any run and click Compare to select another run as the reference baseline. The comparison view shows per-metric delta chips (green = improvement, red = regression) across throughput, p50/p95/p99 latency, and error rate.

Look for:

  • Throughput (RPS). It should grow in proportion to the replica count. Calculate the scaling efficiency: (RPS at 2× replicas) / (2 × RPS at 1 replica). Values above 0.85 (85 % efficiency) are generally good.
  • p95 latency. It should stay flat or improve as you add replicas. If latency rises with more replicas, a shared resource (load balancer, database, cache) is turning into the bottleneck.
  • Error rate. If scaling works, it stays near zero across all runs.

If throughput grows sub-linearly, check:

  • Database connection pool limits (the DB may not scale with the app tier).
  • Session affinity / sticky routing reducing effective parallelism.
  • Shared cache (Redis) becoming a hotspot.
  • External API rate limits.
DoDon’t
Keep the test definition identical across all runsChange the VU count or scenario between runs, which makes results incomparable
Tag each run with the replica count for easy identificationRely on memory to track which run had which configuration
Scale replicas cleanly and wait for pods to be Ready before runningRun immediately after scaling; a pod in Pending state distorts results
Compare using MaxoPerf’s run comparison viewCompare throughput numbers across different test types or durations