skip to content

A JMeter run's summariser rate flattens while its Active count keeps climbing. Which JMeter output records that?

level: seniorimportance: should knowfreq 52%

answer

  1. Two rate figures, only one is current
  2. One column counts threads, not samples
  3. The timer's unit is not per second
  4. Silence between lines is data too

basics

~20 s

Successive + delta lines hold the story: the /s figure, the Active count, the Avg time and the Err share, window by window. Beside them sit jmeter.log at ERROR and any gap where no line was printed at all.

solid answer

~40 s

Everything JMeter records about it is on the `+` lines and in `jmeter.log`. Each `+` line pairs a rate measured from completed samples with `Active`, the engine-wide count of threads started and not yet finished, so consecutive lines show the two series diverging. Use the `+` rate, not the `=` line's, which is a cumulative average and lags badly. If the plan paces with a **Constant Throughput Timer**, its field is samples per *minute*, so divide by 60 before comparing it with the `/s` figure. `jmeter.log` adds timestamped copies of the same lines plus any `ERROR` entries. Beyond that, and a startup capacity block at the top of `jmeter.log`, JMeter prints nothing about the injector host itself.

code

text · 6 lines
text
summary +   4200 in 00:00:30 =  140.0/s Avg:   340 Min:    98 Max:  1902 Err:     0 (0.00%) Active: 200 Started: 200 Finished: 0
summary =  17350 in 00:02:04 =  139.9/s Avg:   210 Min:    88 Max:  1902 Err:     0 (0.00%)
summary +   4260 in 00:00:30 =  142.0/s Avg:   690 Min:   101 Max:  3805 Err:     0 (0.00%) Active: 400 Started: 400 Finished: 0
summary =  21610 in 00:02:34 =  140.3/s Avg:   304 Min:    88 Max:  3805 Err:     0 (0.00%)
summary +   4190 in 00:00:30 =  139.7/s Avg:  1410 Min:   104 Max:  7702 Err:     0 (0.00%) Active: 600 Started: 600 Finished: 0
summary =  25800 in 00:03:04 =  140.2/s Avg:   484 Min:    88 Max:  7702 Err:     0 (0.00%)

go deeper

for a junior

Know that the + line carries both a rate and an Active count, and that they are measured from different things: one from samples that finished, one from threads the engine has started.

for a middle

Explain why the = line's rate lags the + line's, and remember that the Constant Throughput Timer's target is per minute while the summariser prints per second, so any comparison needs a factor of 60.

for a senior

Read a run from its console scrollback and jmeter.log together: quote the right rate over the right window, note the Active count beside it, check Err, and say plainly which figures you have and which you do not.

for a principal

Decide what a run must record before anyone is allowed to draw a conclusion from it. JMeter's output is thin on the injector itself, so the standard you set is what stops arguments being settled by whoever remembers the console best.

## What the console is actually showing you During a ramp, JMeter's summariser gives you two independent series on the same `+` line: a **rate** measured from completed samples, and a **thread count** taken from the engine's own counters. They move for different reasons, so a run where one flattens while the other climbs is a run where those two series have come apart. Read the sample output above column by column: - **`140.0/s` then `142.0/s` then `139.7/s`** — the delta rate, samples in that window divided by the window's span. Flat to within noise. - **`Active: 200` then `400` then `600`** — threads started and not yet finished, counted across every thread group in the engine. Tripled. - **`Avg: 340` then `690` then `1410`** — mean sample elapsed time in milliseconds. Roughly tracking the thread count. - **`Err: 0 (0.00%)`** — nothing has failed yet, so the flat rate is not being propped up by fast failures. ## The two rate figures are not interchangeable The last `=` total line in the same block reads `140.2/s` over `00:03:04`. That is a cumulative average over the whole run, and it moves slowly by construction — after three minutes it will barely register a change that the `+` line shows immediately. **Quote the `+` line when you are describing the current rate**, and never mix the two in the same sentence. ## Comparing the rate against a configured target If the plan paces with a **Constant Throughput Timer**, its field is labelled *Target throughput (in samples per minute)*. The summariser prints samples per **second**. Comparing them means dividing the target by 60 first: a timer set to `12000` is asking for 200/s, so a `+` line stuck at `139.7/s` is a run that is not reaching its configured target. That gap is the evidence; what the timer does about being behind schedule belongs to the throughput-timer material, not here. ## The rest of JMeter's evidence surface Everything JMeter itself will tell you about this is in three places: 1. **The console / `System.out` stream** — the `+` and `=` lines, controlled by `summariser.out`. 2. **`jmeter.log`** — the same lines timestamped if `summariser.log` is on, plus anything the engine logged at `INFO` or above. `Thread is done:`, `Thread finished:` and any `ERROR` entry live here. 3. **A gap in the lines themselves.** The summariser is driven by arriving samples, so a stretch of console with no line at all is a period in which nothing completed near a reporting boundary. There is no fourth place. Apache JMeter 6 ships **no listener that reports the injector host's own CPU or memory while a test runs** — the Monitor Results listener was dropped years ago — so `Active`, `Started` and `Finished` are the only host-side numbers that move during the run. `jmeter.log`'s startup block does print `os.name`/`os.arch`, `Max memory`, `Available Processors` and the local IP once, but that is the box's and the JVM's capacity, not what either did under load. GC pauses are only visible if the `VERBOSE_GC` line in `bin/jmeter` was uncommented before the run, and it ships commented out. ## What this evidence does not settle JMeter prints figures, not conclusions. A flat rate beside a rising `Active` count is consistent with more than one story, and the summariser has no opinion about which one applies to your run. Working out which side of the wire has run out of room, and what a defensible answer to that looks like, is a diagnostic exercise this material deliberately leaves alone. What you owe the diagnosis is an accurate reading of the lines: which rate figure you quoted, over which window, at what `Active` count, with what `Err` share, and whether `jmeter.log` carried anything at `ERROR` at the same timestamps.

  • Why is the = line's rate a poor thing to quote while a run is still going?
    It is the whole run's samples divided by the whole run's elapsed time, so every new window is a small correction to a large average. Three minutes in, a change the `+` line shows at once moves the `=` figure by a fraction. The `=` line is a summary, not a live reading.
  • A JMeter Constant Throughput Timer is set to 12000 and the summariser reads 139.7/s. Is the target being met?
    No. The field is *Target throughput (in samples per minute)*, so 12000 is asking for 200 samples per second. The run is delivering about 70% of that. The unit mismatch between the timer's field and the summariser's `/s` is the easiest way to misread this comparison.
  • What does the Err column add to this reading?
    It tells you whether the rate is being held up by work that failed quickly. A flat `/s` at `Err: 0 (0.00%)` is a different picture from the same rate at 30% errors, because failures can complete far faster than successes and still count as samples in the rate.

saying these in an interview costs you the question

  • Quotes the = line's cumulative rate as the current throughput
  • Compares a per-minute timer target straight against a /s figure
  • Treats Active as the number of threads currently awaiting a response
  • Assumes JMeter tracks injector CPU or heap while the run is going
  • Reads a flat rate as a conclusion rather than as a measurement