skip to content

A JMeter dashboard row shows Average 210 ms and 99th pct 8,900 ms — which samples fed each figure?

level: middleimportance: should knowfreq 61%

answer

  1. Same elapsed-time list, different reductions
  2. Nothing filters on the success flag
  3. Two integer columns are single samples
  4. The row carries no clock at all

basics

~20 s

Average and the 99th pct column are computed from exactly the same list of elapsed times: every sample carrying that label inside the report's range, failures included, over the whole run with no time dimension.

solid answer

~40 s

`StatisticsSummaryConsumer` feeds one elapsed-time value per sample into `Average`, `Min`, `Max`, `Median` and all three percentile columns at once, so the two figures differ only in how the same list is reduced. Two properties of that list matter when you read the row. First, **failed samples are included** — `Error %` counts them separately, but their elapsed times still land in `Average` and in the percentile columns. Second, the row has **no time axis**: it covers the whole reporting range, so a slow stretch confined to one part of the run is not visible in it. `Max` is a single sample, not an aggregate. To see when the slow samples happened, move to the over-time graphs, which are aggregated to one-minute ticks by default and whose percentile graph is titled *successful requests only*.

go deeper

for a junior

Know that every response-time column in the row comes from the same set of samples, and that the row covers the whole run rather than a slice of it.

for a middle

Explain that elapsed time is recorded before the success flag is consulted, so failures are in Average and in the percentile columns, and that Min and Max are single samples.

for a senior

Reach for the over-time pages when the question is when rather than how much, and know that the percentiles-over-time graph is successful-only so it will not agree with the table.

for a principal

Set the expectation that a result is quoted as a whole row plus the graphs, not as a single Average, and that the report folder is archived rather than a screenshot of one number.

A row where `Average` and a percentile column disagree by an order of magnitude is the most common thing a JMeter report shows you. Before drawing any conclusion from it, be precise about what JMeter actually put into each column, because both come out of one pass over one list. ## One list, several reductions For every sample that reaches the statistics consumer, JMeter takes the sample's elapsed time and pushes that single number into six aggregators at once: the mean, the median, percentile 1, percentile 2, percentile 3, and the running min/max pair. The sample also increments `#Samples`, adds its received and sent bytes, and — if its success flag is false — increments `FAIL`. So `Average` and `99th pct` in one row are not measuring different things or different requests. They are two reductions of the identical list of elapsed times. ## What is in the list - **Failed samples are in it.** Nothing filters on the success flag before the elapsed time is recorded. A label whose failures return instantly pulls `Average` down; one whose failures time out pushes the percentile columns up. - **The whole reporting range is in it.** The row is a single aggregate across the run, or across the date range the report was told to cover. There is no per-interval breakdown anywhere in this table. - **Transaction Controller parents are in their own row.** They are excluded from the `Total` row only, so their durations do not appear twice in the run-wide figures. - **Empty controller samples are in nothing.** A controller that wrapped zero samples is dropped before aggregation. ## Which columns are single samples `Min` and `Max` are not aggregates at all — each is one recorded sample, the fastest and the slowest the label ever produced, printed as whole milliseconds. A `Max` far above the `99th pct` column tells you a single sample did that, and nothing about how often. By contrast `Average`, `Median` and the three percentile columns are printed to two decimal places, which is a useful tell when you are reading a screenshot: the two integer columns in the Response Times group are `Min` and `Max`. ## Where the time dimension lives If the question you actually have is *when* the slow samples happened, the Statistics table cannot answer it and no amount of squinting at the row will change that. The dashboard's other pages carry the time axis: 1. **Response Times Over Time** and **Response Time Percentiles Over Time** plot the same metrics against the clock. Both are bucketed at `jmeter.reportgenerator.overall_granularity`, which is `60000` ms — one point per minute — unless the report was generated with a different value. 2. The percentiles-over-time graph is titled *"Response Time Percentiles Over Time (successful requests only)"*, so its series and the Statistics table's percentile columns are computed over **different sample sets**. Comparing them number-for-number is a mistake. 3. **Response Time Distribution** and the synthetic distribution graph bucket the same samples by duration rather than by clock time. ## Reading the row honestly - Check `Error %` on the same row first: if it is non-zero, some of what you are reading in the response-time columns is the shape of the failures. - Treat the percentile headings as data. They render from the percentile values the report was configured with, so a report may legitimately show something other than `90th pct`, `95th pct`, `99th pct`. - The dashboard's percentile columns are estimates produced by a sliding-window estimator, and can differ from the figures the GUI's Aggregate Report gives for the same file. Which estimator is in play is a separate configuration question, but the fact that the two surfaces can disagree is worth knowing before you quote one against the other.

  • Does JMeter exclude failed samples from the Statistics table's Average column?
    No. The consumer records a sample's elapsed time before it looks at the success flag, so failures contribute to Average, Min, Max, Median and all three percentile columns. Only FAIL and Error % separate them out, which is why you read those two columns first.
  • Which JMeter dashboard graph is computed over successful samples only?
    Response Time Percentiles Over Time — its title says so explicitly. The Statistics table's percentile columns are not filtered that way, so the graph and the table are over different sample sets and their numbers are not expected to match.

saying these in an interview costs you the question

  • Claims failed samples are excluded from Average
  • Reads Max as an aggregate rather than one sample
  • Expects the row to cover only steady state
  • Compares the table's percentiles to the over-time graph's
  • Assumes the percentile headings are always 90/95/99