Analyzing Results in JMeter

Analyzing Results in JMeter

A beginner-friendly but production-minded guide to turning a pile of numbers into a clear story: what each measurement means, how to read the charts, how to find the cause of a problem, and how to report it honestly.

Imagine a doctor who runs a full set of blood tests on a patient and then simply hands over a printout of two hundred numbers. The patient stares at the page, none the wiser. What matters is not the printout but the reading of it: which numbers are normal, which are worrying, which belong together, and what to do next. The tests gather the data, and the analysis turns it into advice.

A JMeter test works the same way. Running the test is the easy part. JMeter can fire thousands of requests and record every one of them without complaint. The hard and valuable part comes afterwards, when you must decide whether the system passed or failed, where it started to struggle, why it struggled, and what the team should do about it. A tester who cannot analyse results can only report that a test was run. A tester who can analyse results can tell the team something they can act on.

This guide teaches result analysis from zero. You will learn where results come from, what each column and chart means, how to read averages, medians, and percentiles without being fooled, how to spot healthy and unhealthy shapes, how to generate and read the HTML report, how to study errors systematically, how to compare runs, and how to write up your findings. Then we go deeper into scale, security, design patterns, anti-patterns, and troubleshooting. Every new term is explained the first time it appears, and every big idea comes with an everyday comparison.

WWhat Does Analyzing Results Mean?

Analysis is the step that turns measurements into decisions.

Apache JMeter is a free, open-source tool from the Apache Software Foundation. It pretends to be many users at the same time and measures how a system behaves under that crowd. Each request it sends produces a record called a sample, which holds the time taken, whether the request passed, how many bytes came back, and more. Analyzing results means studying those samples to answer questions about the health of the system.

The questions analysis answers

Q1

Did it pass?

Were the response times and error rates within the targets the team agreed before the test?

Q2

Where did it bend?

At what load did response times begin to climb or errors begin to appear?

Q3

Why did it bend?

Which part of the system, such as the database or a service, was the bottleneck?

Q4

Is it better or worse than before?

How does this run compare with earlier runs and with the baseline?

Q5

What should we do?

Which fix, change, or decision follows from the evidence?

Everyday analogy

A football coach watching a match does not just count goals. The coach studies where the team lost the ball, which players tired, and when the opponent found gaps. Analysis is that kind of watching, applied to a load test.

1
sample per request sent
5
questions every analysis should answer
0
conclusions allowed without evidence
i
Good to know

A response time is the time between sending a request and receiving the complete answer, measured in milliseconds. One millisecond is one thousandth of a second, so a value of 250 means a quarter of a second.

WWhy Raw Numbers Are Not Enough

A number without context can mislead as easily as it can inform.

Suppose your test reports an average response time of 800 milliseconds. Is that good? It depends. It depends on the target, on how many users were running, on whether the first minute of warm-up was included, on whether errors were counted, and on whether a few extreme requests dragged the figure up. Without context, the number has no meaning.

Four traps for the careless reader

  • The average trap: a few very slow requests can hide behind a pleasant average.
  • The error trap: failed requests often return quickly, so a failing system can look fast.
  • The warm-up trap: the first minutes of a test behave differently from the steady period, and mixing them blurs the picture.
  • The single-run trap: one run can be affected by chance, other users, or a busy machine, so one result is not proof.

Careful analysis

  • Reads several measurements together
  • Separates warm-up from steady state
  • Checks errors before reading speed
  • Repeats important runs
  • States conclusions with evidence

Careless analysis

  • Quotes one average from one run
  • Includes warm-up and shutdown in the figures
  • Ignores failed requests
  • Compares runs that used different settings
  • Reports hopes as findings
Everyday analogy

A weather report that says “average temperature today: 15 degrees” hides a freezing night and a hot afternoon. The average is true and almost useless for deciding what coat to wear.

i
Production note

Many expensive production incidents begin with a test report that looked good and was read carelessly. Time spent learning to read results is cheap insurance.

WWhere Results Come From

Every sample flows from a sampler to listeners, and optionally to a file.

When a virtual user sends a request, the sampler records the outcome as a sample. JMeter hands that sample to every listener in scope, which is an element that displays or saves results. A listener can draw a table, draw a chart, or write the sample to a file. Understanding this flow explains why the same data can appear in many forms.

flowchart LR
    S["Sampler sends request"] --> R["Sample: time, status, bytes, label"]
    R --> L1["Listeners: live tables and charts"]
    R --> L2["Results file: JTL on disk"]
    L2 --> H["HTML dashboard report"]
    L2 --> X["Spreadsheet or script analysis"]
    R --> B["Backend Listener: external dashboard"]
FIG 1 · One stream of samples, many ways to look at it.
RouteBest forCost during the test
Live listeners in the windowDebugging and small runsHigh at scale
Results file written during the runThe permanent record of every sampleLow
HTML report built from the fileReading and sharing after the runNone during the run
Backend Listener to a dashboardLive team viewing on a screenModerate
Everyday analogy

A cashier records every sale in the till. The shop can watch the till display live, keep the paper roll as a record, or feed the roll into accounting software for end-of-month reports. The sales are the same, and the views differ.

i
Tip

For any run that matters, write a results file. A file can be analysed again tomorrow in new ways. A window that was closed cannot.

TThe Results File: Rows and Columns

The JTL file is a plain table with one row for every request.

The results file is often called a JTL file, short for JMeter test log. It commonly uses the CSV format, which means comma-separated values: a plain text table where each line is a row and commas separate the columns. You can open it in a spreadsheet, a text editor, or a script. The exact columns depend on your settings, but a typical file includes the ones in the table.

ColumnPlain meaning
timeStampWhen the request started, as a number of milliseconds since a fixed date in 1970
elapsedHow long the request took from start to the last byte of the answer
labelThe name of the sampler, which becomes the row name in reports
responseCodeThe status number the server returned, or an error name when none arrived
responseMessageThe short text that goes with the status
threadNameWhich virtual user sent the request
successTrue or false: did the sample pass, including any assertions?
failureMessageWhy an assertion failed, when one did
bytes and sentBytesThe size of the answer and of the request
grpThreads and allThreadsHow many virtual users were active in the group and in total at that moment
LatencyTime until the first byte of the answer arrived
ConnectTime taken to open the connection
Everyday analogy

Imagine a visitor book at a museum that records the time of arrival, the name, the exhibit visited, how long they stayed, and whether they were satisfied. The JTL file is that visitor book for every request.

i
Version note

Which columns appear is controlled by settings, and defaults can differ between versions. Open the first lines of your own file to see exactly what you have.

TElapsed Time, Latency, and Connect Time

Three clocks tick during every request, and they measure different things.

A web request is not one single moment. It is a short sequence: open a connection, send the request, wait for the server to start answering, and receive the whole answer. JMeter records several times along that sequence.

1

Connect time

The time to open the connection to the server. For secure connections, setting up the encryption may be counted as part of it.

2

Latency

The time from sending the request until the first byte of the answer arrives. It shows how quickly the server began to respond.

3

Elapsed time

The time from the start of the request until the last byte of the answer arrives. This is the response time that most reports show.

What the gaps tell you

PatternLikely meaning
High connect timeSlow network, a busy server not accepting connections, or heavy encryption setup
High latency, small gap to elapsedThe server took a long time to think, then answered quickly
Low latency, large gap to elapsedThe answer started quickly but was large or slow to transfer
All three lowA healthy, quick exchange
Everyday analogy

Ordering at a restaurant: the connect time is getting a waiter’s attention, the latency is the wait until the first dish appears, and the elapsed time is until the last plate is on the table. A slow kitchen and a slow delivery are different problems.

i
Tip

When response times rise, look at latency and connect time before blaming the application. A busy network or a connection limit can look exactly like a slow application.

LLabels, Transactions, and Sub-Results

Names decide how your numbers are grouped.

Every sample has a label, which is normally the name of the sampler that produced it. Reports group samples by label, so each row in a summary is one label. This makes good naming essential: two requests with the same name are merged into one row, and requests with vague names produce reports nobody can read.

Transaction Controllers

A Transaction Controller groups several requests into one business step, such as “Checkout”, and reports their combined time under one label. It can produce one parent sample that holds the total, or it can add the total alongside the individual requests, depending on its settings. This is how business people prefer to read results: not “request 14 took 300 milliseconds” but “checkout took 1.2 seconds”.

Naming

One clear name per step

Name every sampler for what it does, and keep names stable between runs so results can be compared.

Grouping

Group by business step

Wrap related requests in a transaction, so reports show steps that people recognise.

Careful

Mind the double count

When both transactions and their inner requests appear in a total, the same time is counted twice.

Everyday analogy

An airline reports the journey time from home to hotel, not just the length of each taxi, queue, and flight. Transactions give your report the same door-to-door view.

!
Watch out

When a report mixes transaction rows with their inner request rows, totals such as overall throughput and overall average can be inflated or skewed. Read the settings that say how transactions are reported, and filter if needed.

SSuccess, Failure, and Failure Messages

A sample fails for more reasons than a bad status code.

Each sample carries a success flag. By default, JMeter’s web sampler marks a response as failed when the status code is in the error range, such as 404 for a missing page or 500 for a server error. Assertions can mark a sample as failed even when the status code looked normal, because the content was wrong. When a sample fails, the file records a failure message explaining which check failed.

Four kinds of failure

KindExampleWhat it usually means
Error status codeA server error number in the response code columnThe application or a service behind it failed
Assertion failureExpected text was missing from the pageThe response was fast but wrong
Connection problemThe response code names an exception instead of a numberThe request never reached the server, or the connection broke
TimeoutThe request exceeded a time limit you setThe server was too slow or stopped answering
Everyday analogy

A parcel can fail to arrive because the courier never left, because it was delivered to the wrong house, or because the box was empty. All three are failures, and the fix is different each time.

i
Tip

Always group failures by label and by message before drawing conclusions. A hundred failures with one message point to one cause. A hundred failures with a hundred messages point to something messier.

TThe Basic Statistics: Count, Minimum, and Maximum

The simplest numbers answer the simplest questions.

Before any clever calculation, three plain numbers deserve a look. The count of samples tells you how much evidence you have. The minimum is the fastest response in the run, and the maximum is the slowest. Together they give the outer limits of the experience.

Reading them well

  • Count: compare it with what you expected, which is users times loops times requests per journey. A shortfall means requests were skipped or threads stopped early.
  • Minimum: shows the best case when everything is quick. It rarely matters on its own, but it gives a floor for what the system can do.
  • Maximum: shows the worst single request. A very large maximum with a normal average points to a rare stall, such as a pause for housekeeping, a retry, or a time-out.
What you seeReading
Count lower than expectedA thread stopped early or a request was skipped
Minimum and maximum close togetherVery consistent behaviour
Maximum hundreds of times the averageRare, extreme outliers worth investigating
Maximum equals a timeout settingSome requests ran until the limit and were cut off
Everyday analogy

Checking the shortest and longest journey times on your daily commute tells you the range of your mornings. The shortest tells you what a clear road feels like, and the longest tells you what the worst day looked like.

i
Production note

A maximum that equals your configured timeout is a strong clue. It means some requests did not finish at all, so the real slowest time is unknown.

TThe Average and Its Weakness

The average is the first number everyone quotes, and the first one that misleads.

The average, also called the mean, is the sum of all response times divided by the number of samples. It is easy to calculate and easy to understand, which is why it is so popular. Its weakness is that extreme values pull it strongly.

A small example

Take five response times: 100, 100, 100, 100, and 1,100 milliseconds. The total is 1,500, and the average is 300. Four of five users had a pleasant 100 millisecond experience. One had an unpleasant one-second wait. The average of 300 describes nobody.

Everyday analogy

If a billionaire walks into a small cafe, the average wealth in the room jumps enormously, though nobody else became richer. Slow outliers drag a response time average in just the same way.

When the average is still useful

  • As a quick first impression of a run.
  • For tracking a stable trend across many similar runs.
  • When the distribution is tight, with few outliers.
!
Watch out

Never judge a system by its average alone. Always read it beside the median and a high percentile, and look at the maximum. If they disagree, the average is probably being pulled by outliers.

TThe Median: The Typical Experience

The middle value ignores extremes and shows what most users felt.

The median is found by sorting all response times from smallest to largest and picking the one in the middle. Half the requests were faster than the median, and half were slower. In the earlier example the sorted times are 100, 100, 100, 100, 1,100, and the middle one is 100. The median says 100, which matches what most users experienced.

Average versus medianWhat it suggests
Close togetherEven times, with few extreme values
Average much higher than medianA group of slow requests is pulling the average up
Both rising together over timeThe whole system is slowing down
Median steady, average risingMost users are fine, but a growing minority suffers
Everyday analogy

Line up your classmates by height and take the person in the exact middle. It does not matter whether the tallest student is two metres or three. The median is that middle person.

i
Tip

The gap between the average and the median is a quick health signal. A widening gap means a tail of slow requests is growing, and that is the moment to look at percentiles.

PPercentiles: Describing the Slow Tail

A percentile says what share of requests finished within a given time.

A percentile answers the question: below what time did this share of requests finish? The 90th percentile is the time below which ninety percent of requests finished. If the 90th percentile is 800 milliseconds, nine out of ten requests were faster, and one out of ten was slower. Percentiles describe the slow tail that the average hides.

The usual ones

90th

Nine in ten

A good general measure of the experience of almost everyone, but the slowest tenth is hidden.

95th

Nineteen in twenty

A common target in service agreements, which says how bad the bad days are.

99th

Ninety-nine in a hundred

Focuses on the slow tail, which often matters for heavy users and busy systems.

Everyday analogy

An airline that says “ninety-five percent of our flights arrive within fifteen minutes of schedule” tells you much more than one that says “our average delay is five minutes”. The first describes your worst likely day. The second hides it.

Why teams set targets as percentiles

  • They protect almost every user, not just the typical one.
  • They are not distorted by one freak outlier.
  • They reflect what people remember: the slow experiences.
i
Production note

Percentiles cannot be averaged across runs or labels without care. The average of two 95th percentiles is not the 95th percentile of the combined data. Calculate them from the full samples when you can.

TStandard Deviation: How Scattered Are the Times?

The spread of the times is a measure of consistency, and users feel consistency.

Standard deviation is a number that describes how far response times typically stray from their average. A small value means most requests took about the same time. A large value means they were scattered widely. It is measured in the same unit as the response time, so a deviation of 50 means the typical stray was about fifty milliseconds.

Why consistency matters

Two systems can both average 200 milliseconds. In the first, every request takes between 190 and 210. In the second, half take 20 and half take 380. The averages match, but the second system feels erratic, and users notice erratic behaviour more than steady slowness.

Deviation compared with the averageWhat it suggests
Much smaller than the averageSteady, predictable behaviour
About the same as the averageQuite scattered, a mix of fast and slow requests
Larger than the averageVery uneven, probably a few extreme outliers
Rising as the test goes onIncreasing contention or queueing in the system
Everyday analogy

Two commuters both spend an average of forty minutes travelling to work. One always takes between thirty-eight and forty-two. The other takes anywhere from fifteen to ninety. The second cannot plan the morning, and that unpredictability is what a large deviation measures.

i
Tip

When a label mixes different requests, its deviation may look large simply because the requests differ naturally. Check that rows describe comparable things before worrying about the spread.

TThroughput: How Much Work Gets Done

Throughput counts finished requests over time and speaks about capacity.

Throughput is the number of requests completed in a given period, such as per second or per minute. JMeter reports it for each label and for the whole test. In essence it is the number of samples divided by the time between the start of the first request and the end of the last. Because it includes any pauses in your plan, it describes what the system actually handled in your test, not an idealised maximum.

Reading throughput with other numbers

ObservationLikely reading
More users, higher throughput, steady response timesThe system has capacity to spare
More users, flat throughput, rising response timesA bottleneck has been reached
More users, falling throughputOverload: the system is doing wasted work
High throughput with high error rateQuick failures are inflating the count
Everyday analogy

Think of a toll booth on a motorway. Response time is how long one car waits. Throughput is how many cars pass in an hour. A booth may serve each car quickly, yet still be limited by how many lanes are open.

!
Watch out

Throughput counts failed requests as well as passed ones. A system that fails instantly can show impressive throughput. Always read it next to the error rate.

EError Rate: The Number to Read First

Speed means nothing if the requests are failing.

The error rate, shown as Error % in the reports, is the share of samples that failed. It is the first number a careful analyst reads, because a high error rate changes the meaning of every other number. Failed requests often return quickly, so a failing system can show excellent response times and high throughput.

How to read it

  • Zero: good, but check that your assertions are strong enough to catch wrong content.
  • A small steady rate: may be acceptable if your targets allow it, but find out what the errors are.
  • A rate that begins at a certain load: shows the point where the system starts to fail, which is a key finding.
  • A sudden burst: suggests an event such as a restart, a deployment, or a dependent service failing.
Everyday analogy

A restaurant that closes its doors has no waiting queue and a service time of zero seconds. The numbers look wonderful, and the business is failing. The error rate is the sign on the door.

i
Production note

An error rate of zero from a test with no content assertions is weak evidence. The system may be returning polite error pages with normal status codes. Strong assertions make the error rate trustworthy.

BBytes and Bandwidth

The size of the traffic shows whether the network is the limit.

JMeter records how many bytes each response contained, and reports data rates, such as kilobytes received per second and sent per second. A byte is a small unit of data, and a kilobyte is about a thousand bytes. These figures tell you how much traffic the test generated and help you notice when the network, not the application, is the bottleneck.

FigureWhat it tells you
Average bytes per responseWhether pages are heavy, and whether sizes change under load
Received KB per secondHow much data flowed back to the load generator
Sent KB per secondHow much data the requests carried to the server

Useful clues in the sizes

  • A sudden drop in average bytes with a rise in speed often means pages have become error messages.
  • A flat data rate while users rise suggests a bandwidth ceiling somewhere in the path.
  • Very large responses may explain a large gap between latency and elapsed time.
Everyday analogy

A water pipe has a fixed width. Opening more taps will not increase the flow once the pipe is full. A flat data rate under rising load is that full pipe.

i
Tip

Compare the bytes of the same label between a good run and a bad run. If the sizes differ, the responses were not the same, and the speed comparison may not be fair.

LLinking Users, Response Time, and Throughput

A simple rule ties three numbers together, and it is a powerful sanity check.

Users, response time, think time, and throughput are not independent. A well-known rule, often called Little’s Law, says that the number of users in a steady system equals the throughput multiplied by the time each user spends in one cycle. A cycle is the response time plus the think time. In plain words: if each user completes one request every ten seconds, then a hundred users produce about ten requests per second.

flowchart LR
    U["Number of active users"] --> C["Each user's cycle: response time plus think time"]
    C --> T["Throughput: requests completed per second"]
    T --> CHK["Check: users divided by cycle time should match throughput"]
    CHK --> OK["Match: results are consistent"]
    CHK --> BAD["Mismatch: suspect warm-up, errors, or a faulty plan"]
FIG 2 · Users, cycle time, and throughput must agree in a steady run.

A worked idea with numbers

Suppose a run has one hundred users, an average response time of one second, and a think time of nine seconds. Each cycle lasts about ten seconds. The expected throughput is about ten requests per second. If the report shows two requests per second, something is wrong: users may be stuck waiting, many requests may be failing slowly, or the plan may not do what you think.

Everyday analogy

If a hundred people each visit a shop once every ten minutes, the shop sees about ten customers per minute. If the till records only two, either the shop has a long queue outside, or the people are not visiting as often as you thought.

i
Production note

Use this rule as a quick check on every run. A report that violates it is not a reason to celebrate or panic, but a reason to investigate before trusting any of the numbers.

SSteady State and Warm-Up

Judge the system when it is settled, not while it is still waking up.

Every test has three stages. During the ramp-up, users arrive and the load climbs. During the steady state, all users are running and the load is constant. During the ramp-down, users finish and leave. Systems behave differently in each stage. Caches are empty at the start, connections are still opening, and code may still be warming up, so the first minute is often slower than the rest.

1

Ramp-up

Throughput climbs and response times may creep up as the system warms. Do not judge the system by this stage.

2

Steady state

Everything is running at full load. This is the stage worth measuring and reporting.

3

Ramp-down

Users leave and throughput falls. Do not mistake this fall for a problem.

Everyday analogy

A stadium filling for a match looks different from a stadium full and seated, which looks different again from a stadium emptying. You would not judge the crowd’s behaviour by the hour when the gates opened.

Practical habits

  • Make the steady state long enough to contain thousands of samples, and several times longer than the ramp-up.
  • When you build a report, exclude the early and late periods, or read statistics for the steady period only.
  • Always note the length of each stage when you compare runs.
!
Watch out

If the ramp-up lasts as long as the whole test, there is no steady state to measure. Every figure then mixes a changing load into one blurred number.

RReading the Shape of a Healthy Run

A healthy chart is boring, and boring is the goal.

Charts show things that tables hide: trends, steps, spikes, and drifts. Learning the look of a healthy run helps you notice quickly when a run departs from it.

Signs of health

  • Response times form a narrow band that stays at about the same height during the steady state.
  • The average and the median lie close together and move very little.
  • Throughput rises during ramp-up, then levels off at a steady figure.
  • The number of active users matches the plan, flat at the top.
  • Error counts stay at zero, or at a flat, low level.
Flat
response time band during steady state
Level
throughput at constant load
Zero
or very low flat error count
Everyday analogy

A calm lake reflects the sky with no ripples. A healthy chart is the same: smooth, flat, and predictable. A stone dropped in the lake makes ripples, and a burst of slow requests makes a spike.

i
Production note

A flat chart proves the system is steady. It does not prove the system is correct. If every request returns a fast error page, the chart can look beautifully calm. Always pair charts with error rates.

UUnhealthy Shapes: A Pattern Guide

Most problems draw one of a few familiar shapes.

Experienced analysts recognise shapes the way a doctor recognises rashes. The table lists common shapes, what they often mean, and what to try next. Treat these as clues, not verdicts, because many different causes can produce the same picture.

Shape on the chartCommon meaningWhat to try next
Response times climb steadily during steady stateA resource is slowly filling, such as memory, connections, or a queueWatch server memory, connection counts, and queue lengths
A sudden step up, then flatA limit was reached, such as a pool sizeCheck pool and thread limits at that load level
Regular spikes at even intervalsA scheduled job, memory clean-up, or cache expiryCompare spike times with server logs
Wide, fuzzy band that keeps wideningContention: requests fighting for a shared resourceLook at locks, database waits, and shared services
Rare huge outliers, band otherwise flatOccasional stalls, retries, or time-outsInspect the slowest requests one by one
Throughput falls while users riseOverload with wasted workReduce the load and find where the fall began
Errors begin at one load levelA capacity limit or a failing dependencyStudy the error types at that moment
Everything drops to near zeroRequests stopped completing, or the test endedCheck whether the server crashed or the test stopped
Everyday analogy

A doctor who sees a fever knows it could be a hundred illnesses. It tells her something is wrong and where to look next. A chart shape works the same way: it directs your attention, and then you investigate.

!
Watch out

Do not blame the server before checking the load generator. A test machine short of memory or processor power can draw the same sluggish shapes, and you would then be measuring your own computer.

FFinding the Knee: Capacity and Saturation

Every system has a load level where it stops coping gracefully.

If you raise the load step by step and plot response time against users, a typical system shows three zones. At light load, response times are low and flat. As load grows, a point arrives where response times begin to curve upward. This point is called the knee. Beyond it, response times rise steeply and throughput stops growing or falls. The load at the knee is a practical measure of capacity, and finding it is one of the main goals of a load test.

flowchart LR
    A["Light load: response time flat, throughput rising"] --> B["Approaching the knee: response time begins to curve upward"]
    B --> C["The knee: throughput stops growing"]
    C --> D["Saturation: response time rises steeply, errors appear"]
    D --> E["Overload: throughput falls, failures dominate"]
FIG 3 · The stages of a system as load increases.
ZoneResponse timeThroughputErrors
ComfortableLow and flatRising with usersNone
Near the kneeStarting to riseRising more slowlyRare
SaturatedHigh and climbingFlatAppearing
OverloadedVery high or timing outFallingMany
Everyday analogy

Cars on a motorway flow freely until the road fills. Past a certain density, every extra car slows everyone, and eventually traffic crawls. The knee is the density at which the flow stops improving.

i
Tip

Plan your capacity from a load comfortably below the knee, not at it. Real systems need headroom for bursts, failures, and growth.

LLive Listeners: A Quick Tour

Several listeners show results while the test runs, each with a different strength.

Debug

View Results Tree

Shows every request and response in detail. Excellent for debugging a few users, and too heavy for large runs.

Table

Summary Report

One row per label, with counts, times, error percentage, and throughput. Light and quick to read.

Table

Aggregate Report

Like the summary, but adds the median and the 90th, 95th, and 99th percentiles.

Chart

Graph Results

A live line chart of response times with average, median, deviation, and throughput. Fun and heavy, for small runs.

Chart

Aggregate Graph

Draws bar charts of aggregate figures for each label, which makes comparing requests easy.

Chart

Response Times Graph

Plots response times over time for each label, so you can see which requests change as the test runs.

Everyday analogy

A car has a speedometer, a fuel gauge, a trip counter, and a warning light. Each answers a different question about the same journey. Listeners are the gauges of a load test.

A rule of thumb

Use the lightest listener that can answer your question, and disable the heavy ones before big runs. For any run that matters, write a results file and do the real analysis afterwards, when the machine is not busy generating load.

!
Watch out

Several listeners keep every sample in memory. Leaving them enabled in a large run can slow or crash the load generator, and the numbers they show will then be unreliable.

RReading the Summary Report

A short routine turns a table of numbers into a verdict.

ColumnPlain meaningWhat to look for
# SamplesHow many requests of this kind were sentDoes it match the plan’s expectation?
AverageThe mean response timeCompare with target and median
Min and MaxThe fastest and slowest timesA huge maximum signals outliers
Std. Dev.The spread of timesLarge relative to average means uneven behaviour
Error %The share of failed requestsRead this first
ThroughputRequests handled per unit of timeDoes it match what the plan should produce?
Received and Sent KB/secData ratesA flat rate under rising load hints at a bandwidth limit
Avg. BytesAverage size of an answerSudden shrinking can mean error pages

A calm reading routine

1

Read Error % first

If it is not near zero, find out why before reading anything else.

2

Check the sample counts

Confirm they match users times loops times requests per journey.

3

Compare average and maximum

A wide gap suggests outliers worth studying.

4

Look at each label separately

The total row hides which request is the slow one.

5

Write a one-line verdict

For example: passed the targets for all labels, with no errors and steady times.

Everyday analogy

A school report card lists every subject plus an overall result. A good teacher reads each subject, not just the total, because the total can hide the one subject where the child is failing.

i
Production note

The summary table has no percentiles. For targets stated as percentiles, move to the Aggregate Report or the HTML dashboard.

RReading the Aggregate Report

The aggregate table adds the median and the percentiles that targets are written in.

The Aggregate Report looks like the Summary Report but replaces some columns with the median and three percentiles: the 90th, 95th, and 99th. Because many service targets are stated as percentiles, this is often the first table that gets copied into a report.

ColumnPlain meaning
LabelThe request or transaction name
# SamplesThe number of requests of this kind
Average and MedianThe mean and the middle response times
90%, 95%, and 99% LineResponse times below which that share of requests finished
Min and MaxThe fastest and slowest times
Error %The share of failed requests
ThroughputRequests per unit of time, scaled to a convenient unit
Received and Sent KB/secData rates in each direction

Reading across a row

Read each row from left to right as a story. The median tells you the typical experience. The 90th percentile says how bad it gets for most unlucky users. The 99th says how bad the worst days are. The maximum is the single worst moment. If these figures rise gently, the system is consistent. If they jump sharply between the median and the 99th, there is a slow tail to investigate.

Everyday analogy

A bus company can report the typical journey time, the time that nine out of ten journeys beat, and the time of the worst journey of the month. The three together describe the service far better than any single figure.

i
Tip

Save the aggregate table to a file at the end of a run, or read it from the results file with the report generator. A table on screen is gone when the window closes.

MMore Charts: Core Graphs and Plugin Graphs

Several extra charts answer questions that tables cannot.

Charts show how numbers move over time, which tables cannot. JMeter has core chart listeners, and an optional add-on collection, installed through the JMeter Plugins Manager, adds many more. The exact set depends on your version, so use the table as a map.

ChartQuestion it answersSource
Response times over timeDid response times drift or spike during the run?Core, and the HTML report
Active threads over timeDid the load follow the plan?Plugin, and the HTML report
Transactions per secondHow much work finished each second?Plugin, and the HTML report
Response time versus threadsHow do times change as load rises?Plugin, and the HTML report
Response time distributionHow many requests fell in each time band?HTML report and plugin
Bytes throughput over timeWas the network the limit?HTML report and plugin
Latency over timeDid the server start answering later?HTML report and plugin
Everyday analogy

A weather app shows temperature curves, rain maps, and wind arrows. Nobody asks which is the single correct view, because each answers a different question about the same sky.

i
Version note

Many of these charts also appear in the HTML dashboard report with no add-on at all. For most analysis, the report is the better home for them.

TThe HTML Dashboard Report: An Overview

The best way to read a finished run is to turn the results file into a small website.

JMeter can turn a results file into an HTML dashboard report, a folder of web pages you open in a browser. It contains summary tables, response-time charts over time, throughput charts, percentile charts, and error breakdowns, all built from the saved samples. It costs nothing during the test, because it is generated afterwards.

Pro

Rich and shareable

One folder of pages that anyone can open in a browser, attach to a ticket, or archive.

Pro

No cost during the run

The report is built after the test, so it never slows the load generator.

Pro

Percentiles and charts built in

Everything an aggregate report offers, plus charts over time and error summaries.

Con

Needs a results file

It can only be built from a saved file with the right columns.

Everyday analogy

A sports commentator calls the match live with quick impressions. The next morning a journalist publishes a full match report with statistics and photographs. The dashboard report is the journalist.

i
Tip

Get into the habit of producing a dashboard report even for small runs. The ritual becomes automatic, and your history of reports becomes your best evidence over time.

GGenerating the Report Step by Step

Two routes lead to the same report: during the run, or from an existing file.

JMeter supports two ways of producing the report. One builds it automatically at the end of a non-GUI run, when you tell JMeter to write a report folder. The other builds it from an existing results file at any time later. In both cases, the report folder must be new or empty, and the results file must be in the CSV form with the columns the generator needs, such as the time stamp and the elapsed time. Check the documentation for your version for the exact command options.

flowchart TD
    A["Run the test in non-GUI mode"] --> B["Results file written to disk"]
    B --> C{"Build report now or later?"}
    C -->|"Now"| D["Ask JMeter to build the report at the end of the run"]
    C -->|"Later"| E["Run the report generator on the saved results file"]
    D --> F["Report folder with index page"]
    E --> F
    F --> G["Open the index page in a browser"]
    G --> H["Read, compare, and share"]
FIG 4 · Two routes to the same dashboard report.
1

Save a results file

Run in non-GUI mode with a results file, and keep the default fields the report needs.

2

Choose a fresh folder

Give the report an empty or non-existent folder, so old files do not mix in.

3

Generate

Ask JMeter to build the report, either at the end of the run or from the saved file.

4

Open the index page

Open the main page of the folder in a browser and explore.

Everyday analogy

Developing a photograph from a film roll can be done at the end of a trip or any day later. The film, the results file, is what matters. Keep it safe, and you can develop it again whenever you like.

!
Watch out

If the report folder already contains files, generation may refuse to run or produce confusing mixtures. Use a new folder for every report, named by date and purpose.

AA Tour of the Dashboard

The report has a few main areas, and most analysis starts on the first page.

AreaWhat it showsWhy it helps
Test and report informationSource file, start and end times, and filters in useConfirms which run you are reading
Apdex tableA satisfaction score for each labelA quick view of which requests make users unhappy
Requests summaryThe share of passed and failed requestsA one-glance success rate
Statistics tableCounts, errors, averages, percentiles, and throughput per labelThe main reading table
Errors tableTypes of errors and their countsShows what is failing and how often
Top 5 errors by samplerThe labels with the most errorsPoints to the worst offenders
Charts sectionOver time, throughput, and response time chartsShows how the run evolved
Everyday analogy

A car dashboard puts the speed, the fuel, and the warning lights at the front, and the detailed service history in the glove box. The first page of the report is the front dashboard, and the charts are the service history.

A sensible reading order

  • Check the test information, so you know which run it is.
  • Check the requests summary and the errors table.
  • Read the statistics table, label by label.
  • Open the charts to see the shape of the run.
i
Tip

Resist the urge to jump straight to the colourful charts. The tables give the verdict, and the charts give the explanation.

AApdex: A Satisfaction Score

One number between zero and one that says how happy users probably were.

Apdex stands for Application Performance Index. It turns response times into a single satisfaction score between zero and one. You choose two thresholds. Responses faster than the first are called satisfied. Responses between the first and the second are tolerating. Slower ones are frustrated. The score counts satisfied responses fully, tolerating ones as half, and frustrated ones as nothing, divided by the total.

A worked idea

Imagine one hundred requests. Seventy are satisfied, twenty are tolerating, and ten are frustrated. The score is seventy plus half of twenty, which is eighty, divided by one hundred, giving 0.80. A higher score means a happier crowd.

Score rangeReading
0.94 to 1.00Excellent
0.85 to 0.93Good
0.70 to 0.84Fair
0.50 to 0.69Poor
Below 0.50Unacceptable
Everyday analogy

A restaurant survey might count a meal that arrived quickly as a happy customer, a slightly slow meal as an indifferent one, and a very slow meal as an angry one. The Apdex is the happiness score from that survey.

!
Watch out

The thresholds are set in properties, and a single pair rarely suits every request. A search and a report download deserve different expectations. Agree on thresholds before the test, and do not change them to flatter a result.

TThe Statistics and Errors Tables

Two tables carry most of the verdict.

The statistics table

This table has one row per label, plus a total. Typical columns include the sample count, the error count and percentage, the average, minimum, and maximum, the median, three percentiles, and the throughput, with the data rates. It is the main reading table of the report. Compare each label with its target, and look for rows that stand out: a much higher percentile, an error percentage above zero, or an unusually low throughput.

The errors table

This table groups failures by type and shows how many times each occurred, and what share of all errors it represents. It is the fastest way to answer the question “what is failing?”. A single dominant row means one cause. Many rows with small counts mean several different problems.

What you seeWhat to do
One error type dominatesFix or investigate that one cause first
Many different error typesLook for a shared cause, such as an overloaded dependency
Errors concentrated in one labelStudy that request and its dependencies
Errors spread across all labelsSuspect a system-wide issue, such as the network or a restart
Everyday analogy

A complaints book at a shop shows what customers complain about most. A hundred complaints about one broken door is a different problem from a hundred different small complaints.

i
Production note

The errors table shows what failed, not why. Follow it with a look at the failing requests in a small debugging run, and with the server’s own logs for the same period.

CReading the Charts Over Time

Charts tell you when something changed, which is half the clue to why.

The charts section of the report plots measurements against time. The time axis is divided into slices, whose size is set by a property and is often one minute by default. Each slice shows a summary of the samples that fell inside it. Smaller slices show more detail and more noise. Larger slices smooth the picture and hide short spikes.

Time

Response times over time

Shows whether response times stayed flat, drifted upward, or spiked at a particular moment.

Load

Active threads over time

Shows whether the number of users followed the plan. Use it to line up other charts with load.

Work

Hits and transactions per second

Shows the rate of finished work, and whether it levelled off as users rose.

Faults

Codes per second

Shows when errors appeared and what kinds they were over time.

Tail

Percentiles over time and distribution

Show how the slow tail evolved and how times were spread across bands.

Everyday analogy

A heart monitor in a hospital draws a line against time. The doctor reads not only the height of the beats but when a change began. The time axis of a chart turns a number into a story.

Lining charts up

Always read charts together, on the same time range. If response times rose at the moment active users reached a level, load is the likely cause. If response times rose while users were flat, something else changed, such as a background job, a restart, or a failing dependency.

i
Tip

Note the clock times of any event during the run, such as a deployment or a restart. You can then find it on the charts, and it explains many mysterious spikes at once.

FFiltering and Focusing

Sometimes the useful answer sits inside a slice of the data.

A full results file may contain the ramp-up, the steady state, the ramp-down, debug requests, and requests you do not care about. Reports let you narrow the data. You can include or exclude samples by label, using patterns, and settings let you skip early and late periods. Narrowing helps in several ways.

Why filter

  • Remove warm-up and shutdown so statistics describe the steady period only.
  • Remove noise, such as images and advertising requests, when you want to study your own pages.
  • Focus on one business step, such as checkout, to understand it in depth.
  • Exclude debugging requests that you added only to inspect values.
FilterUse it toCaution
By label patternFocus on or exclude certain requestsA wrong pattern silently hides real data
By time rangeSkip warm-up and shutdownRecord the range, so others can reproduce it
By successStudy only passed or only failed samplesHiding failures can flatter the numbers
Everyday analogy

When studying traffic, you might look at weekday rush hours only, or only at one junction. Narrowing the view clarifies the question, but you must say what you removed, or the reader will assume you showed everything.

!
Watch out

Filtering is also the easiest way to fool yourself. Always state in the report which filters were applied, and keep a copy of the unfiltered numbers.

AAnalysing Errors Systematically

A short decision path turns a list of errors into a cause.

When errors appear, panic is a poor guide. A calm sequence of questions narrows the cause quickly. The diagram shows the path. At each step you ask what the data says, then follow the answer.

flowchart TD
    A["Errors appear in the report"] --> B{"Are they from the test itself?"}
    B -->|"Yes: bad data, missing values, wrong plan"| C["Fix the plan and run again"]
    B -->|"No"| D{"Do they start at a certain load or time?"}
    D -->|"At a load level"| E["Capacity limit: study response times and server resources"]
    D -->|"At a clock time"| F["Event: deployment, restart, scheduled job, dependency failure"]
    D -->|"From the very start"| G["Environment or configuration problem"]
    E --> H["Check server metrics for that moment"]
    F --> H
    G --> H
    H --> I["Record cause, evidence, and recommended action"]
FIG 5 · A decision path from errors to cause.
1

Group by message and label

Find the dominant error type and the requests affected.

2

Find when they began

Use the over-time charts to see whether errors began at a load level or a clock time.

3

Reproduce small

Try the failing request with one user and the results tree. Does it fail alone?

4

Check the server side

Read the server logs and metrics for the same period.

5

Write the finding

State the cause, the evidence, and the suggested action.

Everyday analogy

A detective does not arrest the first person seen near the scene. She gathers the facts, establishes a timeline, and tests each theory against the evidence. Error analysis is detective work.

TTypes of Errors and What They Usually Mean

The response code and message are strong clues to the cause.

What you seeUsual meaningFirst thing to check
Server error codes in the five-hundred rangeThe server or something behind it failedApplication logs and dependency health at that moment
Not found codesThe request asked for something missing, often a wrong path or test data issueThe request address and the test data
Unauthorised or forbidden codesSign-in or permission problems, often expired sessions or tokensCookies, tokens, and session length
Too many requests codesThe system or a gateway is limiting the rateRate limit settings
Gateway or service unavailable codesA front door could not reach the service behind itLoad balancer and back-end health
Connection refused or resetThe server did not accept, or dropped, the connectionConnection limits and the server process
TimeoutsThe server did not answer in timeServer load, slow queries, and timeout settings
Assertion failure messageContent was wrong although the code looked normalThe real response in a debugging run
Non-HTTP response codes naming exceptionsA network or client-side problemThe load generator and the network path
Everyday analogy

When a phone call fails, you hear a busy tone, a wrong-number message, or silence. Each means something different and suggests a different next step. Error codes are those tones.

i
Tip

Keep a short team cheat sheet of what each error usually meant in your own system. After a few runs, patterns repeat, and diagnosis becomes quick.

i
Version note

Exact wording of messages differs between samplers and versions. Use the table as a map of ideas, and read your own report for the real texts.

CCorrelating With Server Metrics

JMeter shows what users felt. Server metrics show why.

JMeter measures from the outside. It knows how long a request took and whether it succeeded, but it does not see inside the server. To explain a slow or failing run, you need the server’s own measurements for the same period: processor use, memory, disk activity, network traffic, database connections, queue lengths, and application logs. Putting the two sets side by side on a common clock is called correlation.

JMeter symptomServer metric to inspectPossible reading
Response times climb as users riseProcessor use on the application serversProcessing is saturated
Slow tail grows, average steadyGarbage collection pauses, disk waits, lock waitsOccasional stalls inside the server
Connect time growsConnection limits, network device loadNew connections are queuing
Throughput flat while users riseDatabase connections, thread poolsA shared resource is exhausted
Errors begin at a clock timeDeployments, restarts, scheduled jobsAn event, not load, caused the damage
Times drift up over a long runMemory, open files, queue sizesA leak or a growing backlog
Everyday analogy

A patient says “I feel tired”, which is JMeter’s view. The doctor adds a blood test and a heart trace, which are the server’s view. Only together do they point to a diagnosis.

!
Watch out

Clocks must agree. If the load generator and the server disagree by a few minutes, every correlation will be misleading. Synchronise clocks before the test, and note the start and end times.

BComparing Runs: Baselines and Regression

A number means little alone. Compared with an earlier run, it means a lot.

A single run tells you how the system behaved once. The real power of testing comes from comparison. A baseline is a trusted earlier run you compare later runs against. When a new version performs worse than the baseline, you have found a regression. When it performs better, you have found an improvement worth recording.

What makes a fair comparison

  • Same test plan: the same requests, think times, and data.
  • Same load shape: the same users, ramp-up, and duration.
  • Same environment: comparable servers, data volume, and network.
  • Same period of analysis: the steady state, not the warm-up of one and the whole of the other.
  • Same generator: similar machine capacity and the same tool version.
CompareWhy it matters
Median and 90th percentile per labelShows both typical and slow-end changes
Throughput at the same loadShows capacity changes
Error rateA faster system that fails more is not better
Resource use on serversA change may trade processor for speed
Knee positionShows whether the capacity limit moved
Everyday analogy

A runner who records every race time can see progress or decline over months. A single time of twenty-five minutes means nothing until it is compared with last month’s twenty-seven.

i
Tip

Store the results file, the report folder, and a short note about the environment and version for every important run. A baseline you cannot find or explain is not a baseline.

VVariance and Repeatability

Two identical runs never give identical numbers. The question is how different.

Even with the same plan and system, two runs differ slightly. Random think times, cache states, background activity, and network noise all play a part. This natural wobble is called variance. Before declaring a regression, you must know how large the normal wobble is. A five percent change inside a ten percent wobble proves nothing.

Measuring the wobble

  • Run the same test three to five times and compare the key numbers.
  • Note the range of each number, such as the lowest and highest median.
  • Treat changes smaller than that range as inconclusive.
  • Look for causes of large variance: shared environments, uneven data, caches, and noisy neighbours.
Everyday analogy

Weighing yourself each morning gives slightly different numbers because of water, clothing, and timing. A change of a few hundred grams means nothing. A steady drop of several kilos over weeks does. Know your scale’s wobble before you celebrate.

!
Watch out

The slow tail has the highest variance. The 99th percentile and maximum can change a lot between identical runs. Base decisions on the median and 90th percentile, and use the tail as a signal to investigate.

SUsing Spreadsheets and Scripts for Your Own Analysis

The results file is plain data, so any analysis tool can read it.

Because the results file is a simple table of values separated by commas, you can open it in a spreadsheet, a database, or a data analysis script. This is useful when the built-in report does not answer your question, or when you want to combine results with other data. No special knowledge of JMeter’s insides is needed, only an understanding of the columns.

Easy

Spreadsheet

Open the file, filter by label, and compute percentiles with built-in functions. Good for small and medium files.

Strong

Database

Load the file into a table and ask questions with queries, such as slowest labels per minute.

Flexible

Analysis script

Use a data analysis language to compute custom statistics, draw charts, and compare many runs automatically.

Shared

Dashboard tool

Feed the data to a monitoring system so the team can watch trends across weeks.

Everyday analogy

A shop’s till roll is a plain list of sales. The owner can read it by hand, type it into a spreadsheet, or give it to an accountant with software. The list is the same. Only the tool changes.

i
Production note

When computing percentiles yourself, use the same method for every run, and state it. Different tools use slightly different calculation rules, so numbers may differ in the last digits.

LLive Monitoring With the Backend Listener

For long tests, watch the numbers on a dashboard while the test runs.

The Backend Listener sends results to an external system while the test runs, in batches, so you can watch live dashboards without opening the results file. A common setup uses a time-series database and a charting tool. The listener sends summaries such as counts, response times, and error counts for each label at regular intervals.

Advantages

  • Live view during long tests
  • History of many runs in one place
  • Easy sharing with the whole team
  • Can be shown next to server metrics

Disadvantages

  • Extra systems to set up and maintain
  • Summaries, not every sample
  • Adds a small amount of work on the generator
  • Needs care with network access and secrets
Everyday analogy

A live scoreboard at a stadium lets everyone follow the match without asking the referee. The final report is still written afterwards, but the scoreboard keeps the crowd informed during play.

i
Tip

Even with live dashboards, still save the results file. Live summaries are for watching. The full file is for proof and later analysis.

PPerformance Cost of Collecting and Analysing Results

Measuring a test must not disturb the test.

Every result you keep costs memory, processor time, and disk space on the load generator. If the generator is busy recording, it may become the bottleneck, and the numbers will describe the generator, not the system under test. A good analyst keeps collection light and does the heavy work afterwards.

ChoiceLight optionHeavy option
Where you runNon-GUI modeGUI mode with listeners open
What you saveCompact fields to a fileFull response bodies for everything
Listeners in the planResults file and one backend listenerMany tree and table listeners
When you analyseAfter the run, from the fileDuring the run, in the same process
Keeping failuresSave details only for failuresSave details for every sample
Everyday analogy

A runner who stops every hundred metres to write notes will run slowly, and the notes will describe a stopping runner. A coach with a stopwatch at the side records without disturbing the race.

!
Watch out

If the load generator’s own processor use is high during a run, treat the results with suspicion. Check the generator’s health as carefully as the server’s.

SScalability: Large Files and Distributed Runs

Big tests produce big files, and the analysis must scale with them.

A long test with many users can produce millions of rows. Opening such a file in a spreadsheet may fail, and the report generator needs memory. When tests are spread over several load generators, each one writes its own file, and results must be combined before analysis.

Ideas that help

  • Save only needed columns, so files stay smaller.
  • Use the report generator or a database instead of a spreadsheet for large files.
  • Merge files from several generators carefully, keeping their time stamps intact and unique thread names or generator labels.
  • Use a larger time slice in reports for very long runs, so charts stay readable.
  • Archive old results and keep reports and summaries for the long term.
Everyday analogy

A town that grows from one hundred to one million people cannot keep its records on index cards. It needs filing systems, summaries, and archives. Large test results need the same grown-up handling.

i
Tip

When combining files from several generators, check that the total thread count and throughput add up as expected. A missing file quietly halves the apparent load.

SSecurity of Result Files

Results can hold secrets, so treat them like any sensitive data.

A results file is not just numbers. It may contain request addresses with tokens in them, response bodies with personal details, sign-in names, and error messages that reveal internal structure. Sharing such a file carelessly can leak information.

RiskWhere it hidesProtection
Tokens and keysRequest addresses, headers, and response bodiesAvoid saving them, or remove them before sharing
Personal dataResponse bodies and test data filesUse fake data and do not save full bodies
Internal detailsError messages, host names, and stack tracesReview before sending outside the team
Shared reportsReport folders sent by email or chatShare through controlled storage with access limits
Old archivesForgotten files on shared drivesSet retention rules and delete what is no longer needed
Everyday analogy

A hospital’s records are shared on a need-to-know basis, and old files are shredded after a set time. A test file full of customer-like data deserves similar respect, even when the data is only test data.

!
Watch out

Test data copied from production is still real personal data. Use invented data in tests wherever you can, and your files become much safer to share.

RReporting Findings to Stakeholders

The best analysis is wasted if the reader cannot act on it.

Different readers need different things. A manager wants a verdict and a risk. An engineer wants evidence and clues. A product owner wants to know whether users will be happy. A short, honest report that answers these needs is worth more than a hundred pages of charts.

1

Start with the verdict

Say in one or two sentences whether the system met its targets, and by what margin.

2

State the scenario

Describe the load, duration, environment, and version so the numbers have context.

3

Show a few key figures

Percentiles, throughput, error rate, and the knee, ideally beside targets and the baseline.

4

Explain the causes

Give evidence from charts and server metrics for each problem found.

5

Recommend actions

List what to fix, what to monitor, and what to retest, in priority order.

6

State limits honestly

Mention what the test did not cover and any filters applied.

Everyday analogy

A doctor handing over a test result says first “you are fine” or “we need to act”, and only then shows the numbers. Leading with the verdict respects the reader’s time.

Lead with the verdict, support it with evidence, and always say what the test did not cover.

AAdvantages, Disadvantages, and Trade-offs

Every way of reading results has strengths and weaknesses.

Advantages of a disciplined analysis

  • Decisions rest on evidence, not feelings
  • Problems are found before users find them
  • Comparisons across versions become possible
  • Capacity planning gets real numbers
  • The team shares one language for performance

Disadvantages and costs

  • It takes time and skill to do well
  • Numbers can give false confidence if the test was unrealistic
  • Large files and many charts can overwhelm readers
  • Results describe a test environment, not production itself
Trade-offOne sideOther side
Detail versus speedSave everything for deep analysisSave little to keep the generator light
Live versus afterwardsWatch in real timeAnalyse calmly with the full file
Simple versus richOne verdict number for managersMany charts for engineers
Small slices versus largeSee short spikesSmooth out noise
Everyday analogy

Keeping a diary in great detail gives rich memories but costs an hour each evening. A short note costs a minute but loses colour. Pick the level of detail that matches how you will use it.

DDesign Patterns for Good Analysis

A few habits make analysis calmer and more reliable.

Pattern

Targets first

Write the pass and fail targets before running, so the data cannot bend the goalposts.

Pattern

Verdict, then evidence

Read the summary, then the tables, then the charts, then the server metrics.

Pattern

Steady-state window

Always cut warm-up and shutdown before computing the headline numbers.

Pattern

Always a baseline

Compare every important run with a trusted earlier run.

Pattern

Repeat before concluding

Run a close call three times before calling it a regression.

Pattern

Archive with context

Keep the file, the report, and the notes together in a clearly named folder.

Everyday analogy

A good cook has habits: tidy the workspace, taste as you go, write down what worked. None of the habits is exciting, but together they make every meal better.

AAnti-Patterns to Avoid

These mistakes appear again and again in real reports.

AP-1Avoid
Quoting only the average

The average hides the slow tail, and the slow tail is what users remember. Report the median and at least the 90th and 95th percentiles.

AP-2Avoid
Including the warm-up in headline numbers

The first minutes are not typical. Cut them, and state that you did.

AP-3Avoid
Ignoring errors because response times look good

Failed requests are often very fast. A low average with a high error rate is a bad result, not a good one.

AP-4Avoid
Analysing in the GUI under heavy load

The tool itself becomes the bottleneck. Run in non-GUI mode and analyse afterwards.

AP-5Avoid
Judging from a single run

One run cannot show variance. Repeat close calls before drawing a conclusion.

AP-6Avoid
Changing thresholds after seeing the result

Moving the targets to match the data defeats the purpose of testing. Fix them in advance.

AP-7Avoid
Sharing raw files without review

Result files may contain tokens and personal data. Check before sending outside the team.

Everyday analogy

Driving with a cracked mirror, skipping seatbelts, and ignoring warning lights may work for a while. Each shortcut is a small risk, and together they make a trip unsafe.

TTroubleshooting Analysis Problems

When the results themselves look wrong, check the basics first.

SymptomLikely causeWhat to try
Report generation failsMissing columns, bad file, or non-empty folderCheck the file header and use a new report folder
Charts are emptyWrong time range or filters hide all dataRemove filters and check the time stamps
Throughput looks far too lowGenerator saturated or long think timesCheck generator resources and the plan’s timers
Everything fails with very short timesThe test cannot reach or sign in to the systemRun one user with the results tree and read the response
Transaction numbers look doubledParent and child samples counted togetherFilter by label or use the parent only
Numbers differ between toolsDifferent percentile methods or filtersUse one method and document it
Result file is enormousToo many saved fields or full bodiesSave fewer fields and details only on failure
Times change wildly between runsShared environment or cache effectsControl the environment and repeat the run
Everyday analogy

When a car will not start, you check the fuel and the battery before suspecting the engine. When the results look odd, check the file, the filters, and the test itself before blaming the system.

WA Worked Example: From Raw Run to Verdict

Follow one imaginary run from file to recommendation.

A team tests an online shop before a sale. The target is that ninety percent of checkout requests finish in under three seconds, with fewer than one percent errors, at five hundred concurrent users. The numbers below are invented for teaching.

flowchart TD
    A["Run: 500 users, 30 minutes, non-GUI"] --> B["Build report from the results file"]
    B --> C["Cut ramp-up and ramp-down"]
    C --> D["Check totals: errors 0.4 percent"]
    D --> E["Read table: checkout 90th percentile 3.8 s"]
    E --> F["Charts: times rise after minute 12"]
    F --> G["Server metrics: database connections at limit"]
    G --> H["Verdict: target missed; raise pool and retest"]
FIG 6 · A worked path from results file to verdict.
0.4%
Error rate
3.8 s
Checkout 90th percentile
3.0 s
Target
12 min
Time when times began to rise
1

Totals first

Errors are low at 0.4 percent, inside the target, so the system mostly worked.

2

Table next

Checkout’s 90th percentile is 3.8 seconds. Other labels meet their targets.

3

Charts for timing

Response times were flat until minute twelve, then climbed while users stayed constant.

4

Server clues

Database connections reached their limit at that moment, and requests queued.

5

Recommendation

Increase the connection pool, then repeat the run and compare with this baseline.

Everyday analogy

A mechanic finds the car overheats after twelve minutes of driving, checks the coolant, and finds a slow leak. The story has a clear order: symptom, timing, cause, fix.

MCommon Misunderstandings

A few false beliefs cause most of the bad reports.

BeliefReality
A low average means users are happyThe slow tail may still be serious
Zero errors means a perfect testThe test may be too gentle or check too little
The throughput number is the same as usersThroughput is work finished per time, not people
More charts mean better analysisA few well-chosen views beat many unread ones
Test results describe production exactlyThey describe the test environment and plan only
A response code of 200 means successThe content may still be wrong without an assertion
The maximum is the key figureIt is one unlucky sample, useful as a clue only
One good run proves the system is fastRepeatability must be shown
Everyday analogy

Believing that a restaurant is good because the average wait is ten minutes ignores the table that waited an hour. Averages are comfortable. Individual experiences decide reputations.

BBest Practices and Common Mistakes

Keep these in mind before, during, and after every run.

Best practices

  • Define targets before the test
  • Run in non-GUI mode and save a results file
  • Analyse the steady state only
  • Report percentiles, throughput, and errors together
  • Correlate with server metrics
  • Compare with a baseline and repeat close calls
  • Keep the file, report, and notes together
  • Protect and clean up result files

Common mistakes

  • Looking only at the average
  • Reading the first run as final truth
  • Ignoring generator health
  • Forgetting to record the environment
  • Hiding filters and exclusions
  • Counting transactions twice
  • Sharing files containing secrets
  • Reporting numbers without a verdict
i
Tip

Turn the best practices list into a short checklist stored with your test plans. Checklists are boring and extremely effective.

UReal-World Scenarios

Four short stories show analysis in action.

Before a big sale

An online shop runs a load test at the expected sale peak. The report shows the checkout’s slow tail grows after minutes of steady load. Correlation with server metrics points to a small database pool. The team fixes it and retests with the first run as baseline.

After a new release

A bank runs the same test on every release. A new version shows a median twelve percent higher, outside the usual wobble. The comparison pinpoints one label, and developers find an added query. A regression is caught before customers see it.

Capacity planning

A booking platform steps up users in stages and finds the knee at two thousand users, where throughput flattens and errors begin. The business plans to add servers before expected growth reaches that level.

A mysterious night slowdown

Long soak tests show slow responses at the same clock time every night. Time-based charts and server schedules reveal a backup job competing for disk. Moving the job solves it, and no code changed.

Everyday analogy

Doctors, mechanics, and weather forecasters all do the same thing: measure, compare with normal, and find the cause. Analysing test results is the same craft applied to software.

QQuick Reference

A one-page memory aid for results analysis.

TopicRemember
Where results liveA results file; build reports from it afterwards
Elapsed timeFull request time, from start to the end of the response
LatencyTime until the first byte comes back
Typical experienceMedian
Slow tail90th, 95th, and 99th percentiles
ThroughputFinished requests per time unit
Little’s LawUsers equal throughput times total time per cycle
Steady stateThe period to analyse; cut warm-up and shutdown
KneeThe load where times rise sharply and throughput flattens
ApdexA score from zero to one for satisfaction
CorrelationMatch JMeter data with server data on one clock
BaselineA trusted earlier run for comparison
VarianceKnow the normal wobble before calling a regression
i
Version note

Report options, property names, and listener choices change between versions. Check the documentation of the version you use before depending on a detail.

GGlossary

Short definitions of the words used in this guide.

TermMeaning
SampleOne recorded request and its response
LabelThe name given to a sample or transaction
Results fileA saved table of samples, one per row
Elapsed timeTotal time of a sample
LatencyTime to the first byte of the response
Connect timeTime to open the connection
MedianThe middle value of the sorted times
PercentileThe time under which a given share of samples finished
Standard deviationA measure of how spread out values are
ThroughputCompleted requests per unit of time
Error rateShare of samples that failed
Steady stateThe stable middle part of a run
Warm-upThe early period before the system settles
KneeThe point where performance starts to degrade quickly
SaturationA resource being fully used so work queues up
ApdexA satisfaction score from response times
BaselineA reference run for comparisons
RegressionA change that makes performance worse
CorrelationLinking two data sets by time to find causes
Dashboard reportA set of web pages generated from a results file

FFrequently Asked Questions

Quick answers to questions beginners ask most often.

Q1Which number matters most in a results table?

No single number does. Read the error rate, the median, the 90th or 95th percentile, and throughput together. Each hides what another reveals.

Q2Why is the average not enough?

A few very slow requests can hide among many fast ones. The average blends them, so users with bad experiences vanish from the figure.

Q3What is the difference between latency and elapsed time?

Latency is the wait until the first byte of the response arrives. Elapsed time continues until the whole response is received.

Q4Should I analyse results in the GUI?

Use the GUI for building and debugging, with small loads. For real load tests, run in non-GUI mode, save a file, and analyse afterwards.

Q5How do I make a dashboard report?

Run a test in non-GUI mode with a results file, then ask JMeter to build a report in a new folder, either at the end of the run or from the file later. Check your version’s documentation for the options.

Q6What is a good percentile target?

It depends on the business. Many teams set targets on the 90th or 95th percentile for each important action, agreed with product owners before testing.

Q7Why do my error counts include requests that returned normal codes?

An assertion may have failed because the content was wrong. A normal code does not guarantee a correct response.

Q8What does it mean when throughput stops rising as I add users?

You have probably reached a capacity limit somewhere. Additional users only wait in queues, so response times rise instead.

Q9Why should I remove the warm-up period?

The first minutes are not typical. Caches are cold and load is still rising. Including them distorts the headline numbers.

Q10How many times should I repeat a test?

For important comparisons, three to five runs show the normal variation. For quick checks, one run may do, but treat it as a hint.

Q11Can I trust results if the load generator was busy?

Be careful. A saturated generator adds its own delays, so the results may describe the generator. Check its processor and memory, and add machines if needed.

Q12Are test results the same as production performance?

No. They describe the test environment, data, and plan. The closer these are to production, the more the results can be trusted.

Q13How long should I keep results?

Keep baselines and key reports for as long as they are useful for comparison. Archive or delete the raw files according to your team’s retention rules and security needs.

Q14What should I do first when I see errors?

Group them by message and label, find when they started, reproduce one with a single user, and check the server logs for the same time.

SSummary and Key Takeaways

The essentials of reading JMeter results with confidence.

Analysing results turns thousands of rows into a decision. You learned where results come from, how to read the columns, how to describe typical and slow experiences with the median and percentiles, how throughput and errors complete the picture, and how to tell steady state from warm-up. You saw healthy and unhealthy shapes, how to find the knee, how to use the Summary and Aggregate reports and the HTML dashboard, how to investigate errors, correlate with server metrics, compare runs, and report clearly.

Key takeaways

  • Save a results file in non-GUI mode, and build reports from it afterwards.
  • Prefer the median and percentiles over the average, and never ignore the slow tail.
  • Read response times, throughput, and errors together, never alone.
  • Analyse the steady state, and say which filters you applied.
  • Correlate JMeter data with server metrics on a shared clock to find causes.
  • Compare with a baseline, and know the normal variance before calling a regression.
  • Lead reports with a verdict, support it with evidence, and protect the result files.