Chapter 07Lesson 04~155 minutes

Timers, Think Time, Pacing, Throughput, and Realistic User Behavior: Diagnostics, Failure Modes, and Production Practices

When a paced test runs slowly or misses rate, reconstruct Timer scope and thread supply before blaming the target. Preserve the original timing evidence first.

DiagnosticsDouble think timeRate missStart no pausesCausal timing

Learning objectives

  • Replace arbitrary stabilization sleeps with readiness/business timing.
  • Diagnose throughput targets that exceed thread supply.
  • Find overly broad Timer scope.
  • Detect additive think-time errors.
  • Separate generator and target capacity limits.
  • Explain journey duration without calling Timer delay server latency.
Current lab baseline: Apache JMeter 5.6.3 with a Java 17 JDK; JMeter 5.6.3 requires Java 8+. No third-party plugins are required.

1. Preserve evidence first

Reruns remain http://127.0.0.1:8000, ≤4 threads, ≤12 seconds. Keep JMX, properties, CLI, JTL, jmeter.log, server JSONL/stats, and generator observation before editing.

2. Diagnostic sequence

Preserve, resolve scope, then attribute the limit

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

flowchart TD
E[Preserve evidence] --> V[Versions]
V --> C[Users + duration + all timers]
C --> S[Walk Timer scope]
S --> M[Sum waits + compute N≈λW]
M --> A[Configured vs achieved rate]
A --> G[Generator CPU/JVM/network]
G --> T[Target latency/queues]
T --> F[Smallest correction]
F --> R[Bounded rerun]

3. Failure: arbitrary stabilization sleeps

Adding a 30-second Timer because an environment sometimes is not ready changes the workload and hides readiness. Use a bounded preflight/readiness check before load; keep business think time only where the user model requires it.

4. Failure: assuming a throughput timer creates threads

A PTT can schedule 3 starts/s while one thread can complete only ~1.67 scenarios/s. The rate miss is initially a thread-supply problem, not proof the server lacks capacity.

5. Intentionally broken broad scope

Thread Group
├── Constant Timer — 400 ms
├── Browse
└── Submit

The Timer applies before Browse and Submit. If the business rule is “think after Browse,” move it under Submit and preserve before/after timelines.

6. Double-counted think time

Thread Group
├── Constant Timer — 300 ms
├── Browse
└── Submit
    └── Uniform Random Timer — offset 300 ms, max 300 ms

Submit waits about 600–900 ms because both Timers apply; Browse waits 300 ms. If the intended Submit pause was 300–600 ms, the broad Timer is a modeling defect.

7. Rate above generator/target capacity

Evidence Generator/thread limit Target limit
Active threads All supplied threads occupied. Can also rise when responses slow.
Generator CPU/GC High/saturated. Healthy headroom.
Sampler p95 May remain stable. Often rises with contention.
Target queues/max_active May stay low. Often rises.
jmeter.log Engine/timer clues. Needs target telemetry too.

Do not repeatedly add threads until the number matches. Attribute the limit first and remain inside the authorized envelope.

8. Delayed completion is not endpoint latency

80 ms Browse + 400 ms think + 120 ms Submit yields roughly 600 ms journey time, but the target sampler latencies remain around 80 and 120 ms. Report journey duration and endpoint latency as different populations.

9. PTT Test duration is not a stop condition

The PTT Test duration field helps schedule generation. A Thread Group with infinite loops still needs an independent finite lifetime/stop condition.

10. Start no pauses / validation can bypass Timers

JMeter provides Start no pauses, and validation mode normally ignores Timers. These are authoring tools, not paced-load evidence. Record the execution mode before changing a Timer because “there were no waits.”

11. Experimental Open Model drift

If an optional Open Model schedule is used, preserve exact JMeter version, schedule, seed, and experimental status. Current semantics evaluate the schedule at test start and can interrupt active scenarios when it ends unless tail pause is provided.

12. Shortcuts to reject

  • No arbitrary long sleeps, blanket retries, or unbounded thread increases.
  • No giant heap/OS tuning without generator evidence.
  • No global property hacks or timer.factor changes hidden from the manifest.
  • No TLS/RMI verification disablement or public targets.
  • No evidence deletion after a successful rerun.

Knowledge check

Why does a Thread-Group-level Timer delay both Browse and Submit?

What is Submit wait with a broad 300 ms Timer plus Submit 300–600 ms Uniform Timer?

Why is a PTT miss not automatically target saturation?

What does PTT Test duration control?

Why can 600 ms journey time coexist with 80/120 ms endpoint latency?

Next lesson

Checkpoint: configured versus achieved

Lesson 5 compares sufficient and intentionally insufficient thread supply for the same paced Browse → think → Submit journey.

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.