WASP - How to Choose Between RPS and VUs

When writing a test, you need to decide whether to use RPS or VUs as your load type.

warning

RPS load type can only be used with a Gun, and VUs can only be used with a VirtualUser.


RPS (Requests Per Second)

You should use RPS when your goal is to measure throughput. This load type implements an open model, where:

  • The number of requests is fixed.
  • The load is adjusted to meet the target RPS.
  • The system's response time has no impact on the rate of load generation.

In an RPS-based test, new requests are sent continuously, regardless of how long previous requests take.

note

Read here how to define the RPS load in terms of requests per minute or per hour instead of default per second.

Example RPS Test Diagram

--- title: RPS test --- sequenceDiagram participant Profile(Test) participant Scheduler participant Generator(Gun) participant Promtail participant Loki participant Grafana loop Test Execution Profile(Test) ->> Generator(Gun): Start with (API, TestData) loop Schedule Scheduler ->> Scheduler: Process schedule segment Scheduler ->> Generator(Gun): Set new RPS target loop RPS load Generator(Gun) ->> Generator(Gun): Execute Call() in parallel Generator(Gun) ->> Promtail: Save CallResult end Promtail ->> Loki: Send batch<br/>when ready or timeout end Scheduler ->> Scheduler: All segments done<br/>wait all responses<br/>test ends Profile(Test) ->> Grafana: Check alert groups<br/>FAIL or PASS the test end

VirtualUser (VUs)

Use VUs when working with stateful protocols or workflows. With VirtualUser, the requests per second rate cannot be guaranteed because:

  • Each iteration begins only after the previous one finishes.
  • The load follows a closed model, where the system's response time affects the RPS.

If the system takes longer to respond, iterations take longer, and the RPS decreases.

Example VUs Test Diagram

--- title: VUs test --- sequenceDiagram participant Profile(Test) participant Scheduler participant Generator(VUs) participant VU1 participant VU2 participant Promtail participant Loki participant Grafana loop Test Execution Profile(Test) ->> Generator(VUs): Start with (API, TestData) loop Schedule Scheduler ->> Scheduler: Process schedule segment Scheduler ->> Generator(VUs): Set new VUs target loop VUs load Generator(VUs) ->> Generator(VUs): Add/remove VUs Generator(VUs) ->> VU1: Start/end Generator(VUs) ->> VU2: Start/end VU1 ->> VU1: Run loop, execute multiple calls VU1 ->> Promtail: Save []CallResult VU2 ->> VU2: Run loop, execute multiple calls VU2 ->> Promtail: Save []CallResult Promtail ->> Loki: Send batch<br/>when ready or timeout end end Scheduler ->> Scheduler: All segments done<br/>wait all responses<br/>test ends Profile(Test) ->> Grafana: Check alert groups<br/>FAIL or PASS the test end

In this model, VU2 starts only after VU1 has finished its iteration.


Summary

  • Use RPS for:

    • Stateless protocols.
    • Measuring throughput.
    • Scenarios where the load generation rate must remain constant.
  • Use VUs for:

    • Stateful protocols.
    • Workflows that involve multiple steps.
    • Scenarios where response time impacts the load generation rate.

note

Learn more about open and closed models here.