Skip to content

Scalability test

A scalability test answers the question: “If I add more instances, does the system actually perform proportionally better?” It is not about finding the breaking point — it is about verifying that the architecture scales horizontally as intended.

  • 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 have the ability to 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, there is a bottleneck — database, shared cache, 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. Keep the VU count high enough that the single-replica run is noticeably 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 feature to place Run 1 and Run 2 side by side and check 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) — should scale proportionally with 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 — should remain flat or improve as replicas increase. If latency rises with more replicas, a shared resource (load balancer, database, cache) is becoming the bottleneck.
  • Error rate — should stay near zero across all runs if scaling works correctly.

If throughput growth is sub-linear, investigate:

  • 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 — results are not comparable
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