Chapter 07Lesson 01~130 minutes

Timers, Think Time, Pacing, Throughput, and Realistic User Behavior: Core Concepts and Mental Model

Chapter 06 made workload inputs portable. Chapter 07 controls when virtual users are allowed to act so a test does not collapse into an unrealistic machine-speed loop.

Think timePacingTimer scopeThroughputConcurrency math

Learning objectives

  • Separate timer waiting from sampler latency.
  • Predict hierarchical Timer scope and additive delays.
  • Distinguish think time, pacing, target throughput, and achieved RPS.
  • Understand Constant and Uniform Random Timers.
  • Explain why throughput timers pace existing threads rather than create them.
  • Estimate required concurrency with N ≈ λW and verify it empirically.
Current lab baseline: Apache JMeter 5.6.3 with a Java 17 JDK; JMeter 5.6.3 requires Java 8+. No plugins are required. Preserve the matching JTL and jmeter.log for every meaningful timing run so sample timing and engine/runtime diagnostics remain separate evidence sources.

1. Why an unpaced loop is often invalid

A real user might read for seconds before submitting. A JMeter thread with no Timer immediately begins its next sampler after the previous response, so the generator can produce a demand pattern no real population creates. That can lead to false capacity conclusions.

Safety: mandatory traffic is only http://127.0.0.1:8000, ≤4 threads and ≤12 seconds per profile.

2. Mental model

Timer waiting versus sampler time

Timer waits are generator-side scheduling state; sampler elapsed is protocol/target time. The diagram keeps those causal intervals separate.

flowchart TD
I[Scenario iteration] --> W[Think / pacing wait]
W --> T[Timer scope]
T --> S[Sampler start]
S --> U[Authorized target]
U --> R[Sampler elapsed]
R --> I
G[Available threads] --> S
C[Generator + target capacity] --> R
S --> O[Achieved RPS]

The Timer delays a JMeter thread before a sampler. The sampler elapsed field measures the protocol operation itself; the earlier Timer sleep is outside that value.

3. Terms that must not be conflated

Term Meaning Not the same as
Think time User pause between actions. Server latency.
Pacing Controls repeat/start frequency. An arbitrary sleep.
Timer scope Samplers inheriting a Timer. Tree display order.
Target throughput Rate a timer tries to schedule. Guaranteed rate.
Achieved RPS Observed sample starts/completions. Thread count.
Active threads Live JMeter user threads. Concurrent requests at the server.

4. Timer scope and execution order

Current JMeter rules process Timers before each sampler in scope. A Timer under a Thread Group can affect every descendant sampler; a Timer attached to Submit applies only before Submit. Hierarchical scope, not where the icon visually appears relative to siblings, controls this.

5. Multiple timers add together

If a 300 ms Thread-Group Timer and a 200 ms Submit-only Timer both apply to Submit, JMeter waits about 500 ms before Submit. This is why timer-scope inspection is mandatory before editing.

6. Constant Timer

Constant Timer gives deterministic delay. It is excellent for controlled experiments and for genuinely fixed business waits, but deterministic does not automatically mean realistic.

7. Uniform Random Timer

Uniform Random Timer adds a uniformly distributed value from zero to Random Delay Maximum plus a Constant Delay Offset. Offset 300 ms and maximum 300 ms yields approximately 300–600 ms waits. The global timer.factor property can multiply random-timer pauses; if used, it must be explicit in the run manifest.

8. Think time versus pacing

Think time belongs inside user behavior. Pacing controls how often iterations or scenario starts occur. Do not shorten think time simply to force a target RPS; that changes the modeled user.

9. Constant Throughput Timer

Constant Throughput Timer calculates variable waits to approach a samples-per-minute target, with several per-thread/shared calculation modes. It still needs enough active threads and target/generator capacity.

10. Precise Throughput Timer

PTT generates a randomized Poisson-style schedule. It does not make each one-second bucket identical and it does not create threads. A non-zero seed can make the schedule repeatable. Current docs recommend narrow placement, commonly under the first element of a test loop.

11. Required-concurrency estimate

Use Little's-Law-style planning:

required_concurrency ≈ target_scenario_rate × mean_thread_occupancy_per_scenario

For Browse 80 ms + think 400 ms + Submit 120 ms, occupancy is about 0.60 s. At 2 scenario starts/s: N ≈ 2 × 0.60 = 1.2, so start with at least 2 threads, then validate headroom.

12. Open arrivals are different

A throughput timer releases existing classic threads; an open model generates scenario arrivals independently. Open Model Thread Group is currently experimental, so it is optional/version-pinned rather than the mandatory path.

13. Read-only inspection

  • List every Timer and parent scope.
  • For each sampler, sum applicable fixed/random waits.
  • Record users, ramp, loops, duration, labels, and which label represents scenario starts.
  • Inspect JTL grpThreads/allThreads, sampler elapsed, target timeline, and generator utilization.
  • Confirm the run was not launched with Start no pauses or validation mode that ignores Timers.

14. DevOps connection

Timer policy is part of workload configuration-as-code. Release comparisons should record Timer type/value/scope, configured rate, achieved rate, sampler percentiles, generator headroom, and target telemetry.

Knowledge check

Does a 400 ms Constant Timer add 400 ms to HTTP sampler elapsed?

What happens when two applicable timers exist?

Why can PTT miss its target?

For 2 scenarios/s and 0.60 s occupancy, what is the first concurrency estimate?

Why is Open Model optional here?

Next lesson

Measure timing policies safely

Lesson 2 runs one-factor loopback experiments for no-wait, fixed/random think time, and throughput scheduling, then deliberately shows a rate target that one thread cannot serve.

Official references and version notes

Version and compatibility note

Verified 2026-09-05: Apache JMeter 5.6.3; release requires Java 8+, labs use Java 17; no plugins. Timers run before in-scope samplers and applicable timers add together. Constant/Precise Throughput Timers pace existing threads and cannot guarantee configured throughput if threads, other delays, the generator, or target are limiting. Precise Throughput Timer uses a Poisson-style schedule, and its timer test-duration field is not the Thread Group stop condition. The current Open Model Thread Group is explicitly experimental and is optional only in this chapter.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.