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.
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 ≈ λWand verify it empirically.
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.
http://127.0.0.1:8000, ≤4 threads and ≤12 seconds per
profile.
2. Mental model
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?
No. It delays the thread before the sampler; the sampler elapsed measures the protocol request/response interval.
What happens when two applicable timers exist?
Their delays are processed and added before the sampler.
Why can PTT miss its target?
It cannot create threads, and other waits, sampler time, generator limits, or target limits can make the schedule unserviceable.
For 2 scenarios/s and 0.60 s occupancy, what is the first concurrency estimate?
About 1.2, so at least 2 threads before measured headroom.
Why is Open Model optional here?
The current built-in Open Model Thread Group is explicitly experimental.
Official references and version notes
- Elements of a Test Plan — timer scope, additive delays, execution order, and Thread Groups.
- Component Reference — Constant, Uniform Random, Constant Throughput, Precise Throughput, and Open Model behavior.
- Properties Reference — timer.factor and result settings.
- Best Practices — thread sizing, coordinated-omission warning, CLI execution, and lean listeners.
- Getting Started — GUI authoring versus CLI load execution.
- Download Apache JMeter — current production release and Java requirement.
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.
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0
Send only Ethereum/ERC-20 compatible assets to this
address.