The JMeter Graph Results Listener Explained

The JMeter Graph Results Listener Explained

A beginner-friendly but production-minded guide to the little chart that draws your response times as they happen: what its five lines mean, how to read them, and when to switch it off.

Imagine you are learning to drive and your instructor sits beside you. You press the pedal, and the dashboard shows a needle moving. You do not need a report at the end of the day to know you are speeding, because the needle tells you right now. A dashboard is useful exactly because it is live, simple, and always in front of your eyes.

Load testing has a small dashboard of its own. When you run a test in Apache JMeter, thousands of requests fly out and thousands of replies come back, but numbers hidden inside a program are no help to anyone. Something has to collect those results and show them. In JMeter, that something is called a listener, and one of the oldest and simplest listeners is the Graph Results listener. It draws a moving chart of response times, with a few extra lines for the average, the median, the deviation, and the throughput.

This guide teaches Graph Results from zero. You will learn what it is, where it sits, what every coloured line means, and how to read the shapes it draws. You will also learn its honest limits, because the official JMeter documentation warns against using it during real load tests. Then we go further, into how it works internally, how it compares with other listeners, how to keep a test healthy at scale, how to watch results safely, security concerns, 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 Is the Graph Results Listener?

Graph Results is a live line chart of how long each request took, with summary lines drawn over it.

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. A JMeter test is described by a test plan, which is a tree of small building blocks called elements. Some elements send requests, and these are called samplers. Some elements collect and display the answers, and these are called listeners. Graph Results is one kind of listener.

The simple definition

The Graph Results listener receives every result that falls inside its scope and plots it on a chart. The chart shows each sample’s response time as a dot, and it also draws lines for the running average, the running median, the standard deviation, and the throughput. Under the chart, a row of numbers shows the same measurements in text form, so you can read exact values as well as shapes.

Everyday analogy

Think of a hospital heart monitor. A nurse does not read a long table of numbers every second. Instead, a line moves across a screen, and a glance tells whether the heart is calm or racing. Graph Results is the heart monitor for your test: it will not diagnose the disease, but it shows at once when the rhythm changes.

What it is not

Graph Results does not judge whether a response is correct, because that is the job of assertions. It does not produce a polished report for your manager, because that is the job of the HTML dashboard report. And it is not designed to sit in a heavy production-size test, because drawing a live chart costs memory and processor time. Knowing these limits early helps you choose the right tool for each question.

5
measurements drawn on the chart
1
chart per listener element
0
files needed to see the chart
i
Good to know

A sample is the result of one request: how long it took, whether it passed, and what came back. Every dot on the graph is one sample, so a busy test draws a lot of dots.

WWhy We Need to See Results at All

A test that cannot be seen cannot be understood.

Beginners often assume that running the test is the hard part and reading the results is easy. In practice it is the other way round. JMeter can send requests with almost no effort, but a pile of raw numbers tells you nothing until somebody summarises it. A listener is the element that turns a pile of numbers into something a human can understand.

Three jobs a listener can do

Job 1

Display

Show results on the screen while the test runs, as a chart, a table, or a tree of requests.

Job 2

Summarise

Boil thousands of samples down to a few figures such as the average time, the error rate, and the throughput.

Job 3

Save

Write results to a file so they can be studied, shared, or turned into a report later.

Graph Results mostly does the first two jobs. It is a display listener with a little built-in summary. That makes it a friendly first stop when you are building a script, because you see the shape of your system’s behaviour in seconds, with no setup and no files.

Why a picture beats a table

Humans are far better at spotting patterns in shapes than in rows of digits. A table of one thousand response times is nearly unreadable, yet a chart of the same data shows at once that times were steady for a minute and then climbed. That climb is exactly the kind of clue a load tester wants to find, and a picture finds it faster.

i
Production note

Teams that run serious tests usually use two kinds of views: a light, live view while the test runs, and a rich report after it ends. Graph Results belongs to the first group, and mostly to the early, small-scale stages of that group.

WWhere the Graph Results Listener Lives in the Test Plan

Position decides which samples the chart receives.

A test plan is a tree. At the top is the Test Plan, under it are thread groups, which are the crowds of virtual users, and below those sit controllers and samplers. You add a listener by right-clicking an element and choosing to add a listener. The element you right-click becomes its parent, and the parent decides the listener’s scope, meaning the set of samplers whose results it receives.

flowchart TD
    TP["Test Plan"] --> L0["Listener at top level: receives results from every thread group"]
    TP --> TG["Thread Group"]
    TG --> L1["Listener under the group: receives results from all samplers in the group"]
    TG --> S1["Sampler: Home Page"]
    TG --> S2["Sampler: Login"]
    S2 --> L2["Listener under one sampler: receives only Login results"]
FIG 1 · A listener sees only the samplers inside its scope.
Where it is placedWhich results it receivesTypical use
Directly under the Test PlanEvery sampler in every thread groupOne overall view of the whole test
Under a thread groupEvery sampler in that groupA view of one type of user
Under a controllerAll samplers inside that controllerA view of one business step
Under one samplerOnly that samplerA focused chart for one slow request

Why scope matters for a chart

A chart that mixes all requests together is hard to read, because a quick request and a slow request draw dots at very different heights. The average line then lands somewhere in between and describes neither. When you want a meaningful picture, place the listener close to the request you care about, or use several listeners for several groups.

!
Watch out

Listeners placed high in the tree collect more samples and therefore use more memory. A listener at the top of a big plan can quietly become the most expensive element in the test.

AAdding the Listener, Step by Step

Five clicks from an empty branch to a live chart.

Adding Graph Results is simple, which is part of its charm. The steps below assume you already have a thread group with at least one sampler, since an empty test has nothing to draw.

1

Choose the parent

Decide where the listener should sit. For a first try, right-click the thread group so the chart shows every request in that group.

2

Open the Add menu

In the pop-up menu choose Add, then Listener, then Graph Results.

3

Name it clearly

Give the element a name that says what it watches, such as “Graph – Checkout Steps”. Names matter when a plan has many listeners.

4

Run the test

Press the green start button. The chart begins to draw as soon as the first samples arrive.

5

Clear between runs

Before the next run, use the clear button on the toolbar so old results do not mix with new ones.

Everyday analogy

Clearing a listener is like wiping a whiteboard before a new lesson. If you forget, the old drawings stay behind, and you may mistake last hour’s mistakes for today’s.

i
Tip

While you are only building and debugging a script with a handful of users, Graph Results is perfectly comfortable. The warnings in this guide are about scale, not about learning.

AAnatomy of the Screen

Every part of the Graph Results screen has a purpose, and most of it is simple.

When you click on the listener in the tree, the right-hand panel shows its settings and its chart. Let us walk from top to bottom.

Part of the screenWhat it isWhat it does
Name and CommentsPlain text fieldsLabel the element so you and your team recognise it
Write results to fileA file name box with a Browse buttonOptionally saves the results this listener receives
Errors and Successes optionsCheck boxes near the file settingsChoose to log or display only errors, or only successes
ConfigureA buttonChooses which result fields are written to the file
Display optionsCheck boxes for Data, Average, Median, Deviation, ThroughputShow or hide each line on the chart
The chartA drawing area with a vertical time axisPlots the samples and summary lines as they arrive
The number rowText boxes under the chartShows current values in text, such as the number of samples

The chart area

The vertical axis shows response time in milliseconds, and the scale adjusts as slower samples appear. The horizontal axis is not a clock. It is simply the sequence of samples as they arrive, so the line moves from left to right as the test continues. This is a subtle point, and we return to it in a later chapter, because it changes how you read the picture.

The number row

Beneath the chart, text boxes display the count of samples and the latest values of the measurements. These are the same figures drawn as lines, but in digits. They are handy when you want an exact reading rather than an impression.

i
Version note

Small details of the layout, such as the exact wording of labels, can differ between JMeter versions. The ideas in this guide stay the same, but always compare with the screen in front of you.

TThe Five Lines: Data, Average, Median, Deviation, Throughput

Each coloured line answers a different question about your system.

The chart draws five measurements, each in its own colour. In the standard JMeter layout the colours are black for data, blue for the average, purple for the median, red for the deviation, and green for the throughput. The colours help you pick them apart at a glance.

Black

Data

The response time of each individual sample. This is the raw material, drawn as many small marks.

Blue

Average

The mean of all response times so far. It answers: what is a typical request taking?

Purple

Median

The middle value when all times are sorted. It answers: how long does the middle request take?

Red

Deviation

The standard deviation, a measure of how scattered the times are around the average.

Green

Throughput

How many requests the system handled per unit of time, shown as a per-minute figure.

Everyday analogy

Picture a school bus route. Data is the minutes each child waited today. Average is the typical wait. Median is the wait of the child standing in the middle of the line. Deviation tells you whether all children wait about the same or whether some wait much longer. Throughput is how many children the bus delivers per hour.

Why five and not one

No single number describes a system. A fast average can hide a few terrible requests. A steady median can hide a worsening tail. A healthy throughput can sit beside rising errors. Looking at several measurements together gives a fairer picture, and the next chapters teach each one in turn.

i
Tip

If the chart looks crowded, untick the lines you do not need. Showing only the average and the median is often enough for a first read.

RReading the Time Axis and the Dots

The black dots are the truth. Every other line is a summary of them.

The response time of a sample is the time between sending a request and receiving the response, measured in milliseconds. One millisecond is one thousandth of a second, so a value of 250 means a quarter of a second. On the chart, the height of a dot tells you how slow that request was: higher means slower.

What a cloud of dots tells you

  • A tight band of dots at a similar height means the system answers consistently.
  • A wide, fuzzy band means response times vary a lot from request to request.
  • A few isolated dots far above the rest are outliers, meaning unusually slow requests that may deserve a closer look.
  • A band that slopes upward over time means the system is slowing down as the test continues.

Autoscaling of the vertical axis

The vertical axis rescales so the slowest sample fits on the chart. This is friendly, but it has a side effect: one huge outlier can stretch the axis so far that all the other dots are squashed into a thin strip near the bottom. If your chart suddenly looks flat, check for a single very slow sample before you decide that everything is fine.

Everyday analogy

Imagine a photograph of a crowd that must also fit one very tall giant. To fit the giant in the frame, everyone else becomes tiny. The giant is the outlier, and the squashed crowd is your useful data.

!
Watch out

The horizontal axis counts samples, not seconds. Two samples that are far apart in time can sit side by side on the chart. Use the chart to see shape and order, not to read exact clock times.

TThe Average: Useful but Easily Fooled

The average is the sum of all times divided by the number of samples, and it can lie.

The average, also called the mean, is calculated by adding up all the response times and dividing by how many samples there were. It is the number most people think of first, and it is useful as a rough guide. The blue line on the chart shows how this running average changes as more samples arrive.

A worked idea with small numbers

Suppose five requests take 100, 100, 100, 100, and 1,100 milliseconds. The total is 1,500, and divided by five the average is 300. Yet four of the five users had a pleasant 100 millisecond experience, and one had a miserable one second wait. The average of 300 describes nobody. It is a number that no real request ever matched.

Everyday analogy

If one billionaire walks into a small cafe, the average wealth of the people in the room becomes enormous, yet nobody else is richer than before. The average was dragged by one person. Slow outliers drag response time averages in the same way.

How the running average behaves

Early in a test the blue line jumps around, because each new sample has a big effect on a small total. As samples pile up, the line settles and moves slowly, because one new sample hardly changes a large total. A settled average can therefore look calm even while recent requests are getting worse, since the old, fast samples still weigh heavily in the sum.

i
Production note

Serious teams rarely rely on the average alone. They also look at percentiles, such as the 90th or 95th, which tell how slow the slowest tenth or twentieth of requests are. Graph Results does not draw percentiles, so use the Aggregate Report or the HTML dashboard for those.

TThe Median: The Value in the Middle

The median ignores extremes, which makes it a good partner for the average.

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. The purple line on the chart tracks this value as the test continues.

Back to the small example

Take the same five times: 100, 100, 100, 100, and 1,100. Sorted, the middle one is 100. So the median says 100, while the average said 300. The median matches the experience of most users, because the single huge value did not affect it at all.

Reading average and median together

What you seeWhat it usually means
Average and median close togetherTimes are fairly even, with few extreme values
Average much higher than medianA group of very slow requests is pulling the average up
Both rising togetherThe whole system is slowing down, not just a few requests
Median steady, average risingMost users are fine, but a growing minority suffers
Everyday analogy

Line up all your classmates by height. The median is the height of the person standing exactly in the middle. It does not matter whether the tallest student is two metres or three, because the person in the middle stays the same.

i
Tip

The gap between the blue and purple lines is a quick health signal. When it widens, go looking for outliers.

TThe Deviation: How Scattered Are the Times?

The standard deviation measures consistency, and consistency is a feature users can feel.

Standard deviation is a number that describes how far response times typically stray from their average. A small deviation means most samples sit close to the average. A large deviation means they are scattered widely. The red line shows the deviation in milliseconds, using the same scale as the response times.

Why consistency matters

Two systems can have the same average time of 200 milliseconds. In the first, every request takes between 190 and 210 milliseconds. In the second, half take 20 milliseconds and half take 380. The averages match, but the second system feels erratic, and users notice erratic behaviour more than steady slowness. The deviation is the number that tells these two systems apart.

Everyday analogy

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

Reading the red line

  • A low, flat red line signals a steady, predictable system.
  • A red line that rises means results are becoming more scattered, often an early sign of resource contention or queueing.
  • A red line higher than the average signals very uneven behaviour, usually caused by a mixture of fast and very slow requests.
i
Production note

When you mix different kinds of requests in one chart, the deviation can look large simply because the requests are naturally different. A large deviation is only a warning when the requests being compared should behave alike.

TThroughput: How Much Work Gets Done

Throughput counts finished requests over time, and it tells you about capacity.

Throughput is the number of requests a system completes in a given period. Graph Results shows it as a green line and expresses it per minute. If the green figure reads 600, the system handled the equivalent of six hundred requests per minute, which is ten per second.

What is included in the calculation

According to the JMeter documentation, this number reflects what your server actually handled, including any delays you added to the test and JMeter’s own small processing time. That choice is deliberate. A figure that removed all delays would describe an imaginary system. A figure that includes them describes something real: the server handled this many requests in a minute, and you can try more users or shorter pauses to discover how many it can handle at most.

Everyday analogy

Think of a toll booth on a motorway. Response time is how long one car waits at the booth. Throughput is how many cars pass through the booth in an hour. A booth can have fast individual service yet still be limited by how many lanes are open.

How throughput relates to users and time

A helpful rule links three ideas: the number of users in the system, the time each request takes, and the throughput. If you keep users constant and response times grow, throughput falls, because each user completes fewer requests per minute. If you add users and the system still has spare capacity, throughput rises. When you add more users but throughput stops rising, you have probably reached the limit of some resource.

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 throughputThe system is overloaded and doing wasted work
Throughput high but errors high tooFast failures are inflating the count
!
Watch out

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

TThe Number Row Under the Chart

The digits below the chart give exact values for what the lines only suggest.

Below the chart, Graph Results shows a small row of read-only text boxes. They hold the current figures for the same measurements the chart draws. Reading them is easy once you know what each one means.

Count

No of Samples

How many samples the listener has received since it was last cleared.

Latest

Latest Sample

The response time of the most recent sample, in milliseconds.

Mean

Average

The running average of all response times so far.

Spread

Deviation

The running standard deviation of the response times.

Rate

Throughput

The current throughput, expressed per minute.

Middle

Median

The running median of all response times so far.

Using the digits well

The digits are most useful when you compare them across runs. Before a change, write down the average, median, deviation, and throughput. After the change, run the same test and compare. If the numbers moved in the direction you expected, the change helped. If not, you have learned something without needing any advanced tool.

Everyday analogy

A car dashboard has a speedometer needle, which shows the shape of your driving, and a digital trip counter, which gives exact numbers. The chart is the needle, and the number row is the trip counter. You usually want both.

i
Tip

Take a screenshot of the number row at the end of each practice run and save it with a short note. Screenshots are a quick lab notebook for early experiments.

RReading a Healthy Graph

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

When a system copes well with its load, the chart has a recognisable look. Learning that look helps you notice quickly when something departs from it.

Signs of health

  • The black dots form a narrow band that stays at about the same height.
  • The blue average and purple median lie close together and move very little.
  • The red deviation line is low and flat compared with the average.
  • The green throughput line rises during ramp-up, then levels off at a steady figure.
  • There are few or no isolated dots far above the main band.
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 creates ripples, and a burst of slow requests creates a spike.

Why a flat line is not always good news

A flat chart means the system is steady. It does not prove the system is correct. If every request returns a fast error page, the chart may look beautifully calm. This is why charts must always be read together with an error rate and with assertions that check the content of responses.

Low
deviation compared with the average
Flat
average and median after warm-up
Steady
throughput at constant load
i
Production note

Real systems have a warm-up period. Caches fill, connections open, and code gets compiled, so the first minute often looks slower than the rest. Judge steady-state health after the warm-up, not during it.

RReading an Unhealthy Graph: A Pattern Guide

Most problems draw one of a few familiar shapes.

Experienced testers recognise shapes the way a doctor recognises rashes. The table below 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
Dots climb steadily as the test runsA resource is slowly filling up, such as memory or a queueWatch server memory, connections, and queue lengths
Sudden step up, then flatA limit was reached, such as a pool of connectionsCheck pool sizes and thread limits at that load level
Regular spikes at even intervalsA scheduled job, garbage collection, or a periodic cache expiryCompare spike timing with server logs
Wide, fuzzy band that keeps wideningContention: requests fighting for the same resourceLook at locks, database waits, and shared services
A few huge dots, band otherwise flatOccasional stalls, timeouts, or retriesInspect the slowest requests individually
Throughput falls while users riseOverload, with the system doing wasted workReduce load and find the point where the fall began
Chart suddenly 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 different 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 that is short of memory or processor power can draw the same sluggish shapes, and then you would be measuring your own computer.

TRamp-Up and the Shape of the Chart

The chart is shaped as much by how users arrive as by how the system behaves.

A thread group controls how many virtual users run and how fast they start. The ramp-up period is the time JMeter takes to start all users. If you ask for fifty users with a ramp-up of fifty seconds, JMeter starts roughly one new user every second. During that time, the load on the server is growing, and so are the response times and the throughput.

Three typical stages

1

Ramp-up

Users arrive. Throughput climbs. Response times may creep up as caches are cold and the load grows.

2

Steady state

All users are running. A healthy system shows flat lines. This is the part of the chart worth judging.

3

Ramp-down

Users finish their loops and leave. Throughput falls. Do not mistake this fall for a problem.

Everyday analogy

Think of a stadium filling for a match. In the first minutes only a few people arrive and the entrances are quiet. Then crowds pour in and queues form. When everyone is seated the entrances are calm again. At the end of the match everyone leaves at once. Each stage looks different at the gates, though the gates themselves have not changed.

A beginner mistake with short tests

If the ramp-up is as long as the whole test, the chart never reaches a steady state, and every line is still changing when the run ends. Give the steady part enough time to be seen, usually several times longer than the ramp-up.

i
Tip

Make small changes between runs and keep a note of the thread group settings next to each result. Charts are only comparable when the load shape was the same.

HHow Graph Results Works Internally

Every sample travels from a sampler to a listener, and the listener updates its model and redraws.

Understanding the internal path explains why this listener is helpful for small tests and costly for large ones. Here is the journey of a single sample.

sequenceDiagram
    participant T as Virtual User Thread
    participant S as Sampler
    participant E as JMeter Engine
    participant G as Graph Results Listener
    participant U as Screen
    T->>S: Run the next request
    S-->>T: Result with time and status
    T->>E: Hand over the finished sample
    E->>G: Deliver the sample event
    G->>G: Update count, average, median, deviation, throughput
    G->>U: Add a point and redraw the chart
FIG 2 · The life of one sample inside Graph Results.
1

The request finishes

The sampler sends the request, waits for the response, and builds a result holding the time, the status, and other details.

2

Post-processing runs

Extractors and assertions in scope run, so the result carries its final pass or fail state.

3

Listeners are notified

JMeter hands the finished sample to every listener in scope. Graph Results receives a copy of the event.

4

The model is updated

The listener adds the response time to its running calculations and updates the average, median, deviation, and throughput.

5

The chart is redrawn

The drawing area repaints so the new point and the updated lines appear on screen.

Everyday analogy

Imagine a scorekeeper at a sports match who must update a large public scoreboard after every single point. When a few points happen per minute, this is easy. When hundreds of points happen every second, the scorekeeper falls behind and the scoreboard becomes the slowest thing in the stadium.

i
Production note

Calculating the median needs the listener to remember response times, not only a running total. That is one reason a listener that shows a median uses more memory than one that only shows a total and a count.

WWhy the Official Advice Says Not to Use It Under Load

The same features that make Graph Results friendly make it expensive.

The JMeter documentation carries a clear warning: Graph Results consumes a lot of memory and processor time, so it should be used for functional testing or while debugging and validating a test plan, and not during a real load test. This is advice from the people who build the tool, and it is worth taking seriously.

Where the cost comes from

Memory

Storing samples

The listener must remember data to calculate statistics such as the median, and memory use grows as the test continues.

CPU

Recalculating

Each new sample triggers fresh calculations, and the chart must be redrawn again and again.

GUI

Drawing on screen

Painting a chart in the graphical interface competes with the very threads that are producing the load.

Skew

Distorted results

A slow load generator sends requests late, so your measurements reflect your own machine instead of the server.

Everyday analogy

A race timekeeper who also paints a live portrait of every runner will finish the race late and with inaccurate times. The work of watching must not slow down the work of running.

What to do instead

  • Run real load tests in non-GUI mode, where no chart is drawn at all.
  • Save results to a file and build the HTML dashboard report afterwards.
  • Use lightweight listeners, or send metrics to an external monitoring tool.
  • Keep Graph Results for short, small runs while building and debugging.
!
Watch out

A disabled listener costs nothing. If you want to keep Graph Results in your plan for convenience, disable it before launching any serious run.

EErrors and Successes: Filtering What You See

Check boxes can limit which samples are logged or displayed.

Listeners that write results to a file share a small set of options near the file name box. Two of them are check boxes labelled for errors and for successes. They choose whether the listener should log or display only failed samples, or only passed samples. When neither is selected, the listener handles every sample.

When filtering helps

  • Errors only is useful when you want a short list of what went wrong without wading through thousands of passing samples.
  • Successes only is useful when you want to study the response times of requests that worked, without failures distorting the picture.
  • No filter is the right choice when you need the complete record, including both groups.
Everyday analogy

An email program lets you view only unread mail, only starred mail, or everything. Filtering does not delete anything. It simply decides what is placed in front of you.

A careful note about meaning

Fast failures can make a chart look healthier than it is, since an error often returns quickly. If you choose to show only successes, response times may look better than the true experience of all users, because the slow failures have been hidden. Always keep an overall count of errors somewhere visible when you filter.

i
Tip

Use a second listener, set to errors only, beside your general listener. One shows how the system performs, and the other shows what is breaking.

SSaving Results to a File and the Configure Button

The chart disappears when you close JMeter, but a file stays.

Every listener has a box where you can type or browse for a file name. When a name is given, JMeter writes the results this listener receives into that file as the test runs. These files are often called JTL files, which stands for JMeter test log. They commonly use either the CSV format, which is a plain text table with comma-separated columns, or the XML format.

The Configure button

Next to the file settings you will find a button that opens a dialog for choosing which fields are saved. Examples of fields include the time stamp, the elapsed time, the label of the sampler, the response code, the success flag, the number of bytes, and the thread name. Saving more fields gives richer files but also bigger files, and writing takes effort during the test.

ChoiceBenefitCost
Save only a few fieldsSmall files, light on disk and processorLess detail for later analysis
Save many fieldsRich data for investigationLarger files and more writing work
Save responses and request dataFull evidence of failuresVery large files and a possible security risk
Save nothingNo file overheadNo record once the window closes
Everyday analogy

A shop receipt can list only the total, or every item with its price and time. A longer receipt answers more questions later, but it takes longer to print and more paper to store.

i
Production note

In real tests the results file is usually written by a lightweight setting or by the command line, not by a chart listener. The file then becomes the single source of truth, and any chart or report is built from it afterwards.

CGraph Results Compared with View Results Tree

One shows the shape of the forest. The other shows every leaf.

The View Results Tree listener lists every individual request. For each sample you can open the request that was sent, the response that came back, headers, status codes, and assertion results. It is the favourite tool for debugging a single request, but it says nothing about trends over time.

QuestionGraph ResultsView Results Tree
Shows the overall trend of response timesYes, as a chartNo
Shows the exact response body of one requestNoYes
Shows assertion failure messagesNoYes
Shows average, median, deviation and throughputYesNo
Best for debugging a script that failsNoYes
Best for a quick feeling of speedYesNo
Suitable for heavy loadNoNo
Everyday analogy

The tree is a magnifying glass for studying one leaf. Graph Results is an aerial photograph of the forest. A gardener needs both, but never uses them for the same question.

A natural pairing while building a script

Many testers keep both listeners in a new plan. They run one user and use the tree to confirm that each request, response, and assertion is correct. Then they run a handful of users and use Graph Results to get a first impression of timing. Once the script behaves, both are disabled before a real run.

!
Watch out

View Results Tree keeps full responses in memory and is even heavier than Graph Results. Use it with very small runs, and consider logging only errors when you need to keep it running longer.

CGraph Results Compared with Summary and Aggregate Reports

Tables of numbers answer questions that a chart cannot.

JMeter offers two table-style listeners that many testers prefer for serious work. The Summary Report shows one row per request label, with columns such as the number of samples, the average, the minimum, the maximum, the standard deviation, the error percentage, the throughput, and the data rates. The Aggregate Report is similar, but it adds the median and several percentiles, such as the 90th, 95th, and 99th.

What a percentile means

A percentile answers the question: below what time did this share of requests finish? If the 90th percentile is 800 milliseconds, then nine out of ten requests were faster than 800 milliseconds, and one out of ten was slower. Percentiles expose the slow tail that an average hides, which is why many service level targets are written as percentiles.

NeedGraph ResultsSummary ReportAggregate Report
See a trend as a pictureYesNoNo
One row per request nameNo, all mixed togetherYesYes
Error percentageNoYesYes
MedianYesNoYes
90th, 95th, 99th percentilesNoNoYes
Memory use compared with Graph ResultsHighLowerModerate
Everyday analogy

A school report card lists every subject with its own marks. A single line that says “average mark” hides the subject where the child is failing. Graph Results is the single average line, while the aggregate and summary reports are the full report card.

i
Tip

Whenever you have more than one kind of request in your test, move to a per-request table early. A mixed chart will never tell you which request is the slow one.

OOther Chart Listeners: Aggregate Graph, Response Times Graph, and More

Graph Results is one of several charting options, each with a different focus.

JMeter includes more than one listener that draws pictures. They differ in what they plot and how much they cost.

Core

Aggregate Graph

Draws bar charts based on the aggregate report figures, such as averages and percentiles for each request label.

Core

Response Time Graph

Plots average response time per request label over time intervals that you choose, which helps compare requests side by side.

Core

Graph Results

Plots each sample plus average, median, deviation, and throughput in one simple live chart.

Plugin

Over-time graphs

Optional add-ons, installed through the JMeter Plugins Manager, add charts such as active threads over time and transactions per second.

Why so many

Different questions need different pictures. Are users arriving as planned? Which request is the slowest? How does the response time of each page change over the run? A single chart cannot answer all of those well, so JMeter and its community offer several. The simple Graph Results chart answers the broadest and shallowest question: how is it going right now?

Everyday analogy

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

i
Version note

Which listeners ship with JMeter, and which need a plugin, depends on your version. Check the Listener menu in your own installation before planning around a particular chart.

TThe HTML Dashboard Report: The Better Picture After the Run

For anything serious, build a report from the saved file instead of watching a live chart.

JMeter can turn a results file into a complete HTML dashboard report. It is a small website that you open in a browser. It contains summary tables, response time charts over time, throughput charts, percentile charts, error breakdowns, and a score called Apdex, which measures user satisfaction using two time thresholds that you configure.

Why this is the preferred route

  • The test itself stays light, since only a plain results file is written during the run.
  • The report is generated afterwards, with plenty of time and no pressure on the load generator.
  • The charts are richer than the live chart, with percentiles, errors, and over-time views.
  • The report folder can be shared with the team, attached to a ticket, or stored as evidence.
Everyday analogy

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

FeatureGraph ResultsHTML dashboard report
Available during the testYes, liveAfter the test, or on demand from a saved file
Cost to the load generatorHigh at scaleNone during the run
PercentilesNoYes
Per-request breakdownNoYes
Shareable with a teamScreenshot onlyYes, as a folder of pages
i
Tip

Name the results file and the report folder after the date and the purpose of the run. Six weeks later, nobody remembers which “results” was which.

NNon-GUI Mode: Running Without the Chart

The graphical screen is for building tests, and the command line is for running them.

JMeter has two ways of running. In GUI mode you see the familiar window with the tree, the listeners, and the charts. In non-GUI mode you start JMeter from a command line, tell it which plan to run and where to write results, and it runs with no window at all. The official guidance is to use the graphical window to create and debug, and to run real load tests in non-GUI mode.

flowchart LR
    A["Build and debug in GUI mode with Graph Results and View Results Tree"] --> B["Save the test plan"]
    B --> C["Run in non-GUI mode with no chart listeners"]
    C --> D["Results file written during the run"]
    D --> E["Generate HTML dashboard report"]
    E --> F["Review, share and compare runs"]
FIG 3 · A healthy workflow uses Graph Results early and the report late.

Why non-GUI is better for real tests

Non-GUI mode

  • Uses far less memory and processor time
  • Keeps the load generator honest and quick
  • Can run on servers with no screen
  • Can be started by automated pipelines

GUI mode with live charts

  • Draws charts that compete with test threads
  • Holds results in memory as the run continues
  • Needs a desktop session open the whole time
  • Becomes unreliable as the user count grows
Everyday analogy

A chef tastes and adjusts a recipe in the home kitchen, with notebook and scales. When the restaurant opens, the same recipe is cooked in bulk in the back kitchen, away from the dining room. The GUI is the home kitchen, and non-GUI is the back kitchen.

!
Watch out

A plan that still contains enabled heavy listeners will carry that cost into non-GUI mode as well, since the listeners belong to the plan. Disable or remove chart and tree listeners before running at scale.

AA Practical Debugging Routine with Graph Results

A short, repeatable routine turns the chart into a useful habit.

Used wisely, Graph Results is an excellent companion while you build a script. This routine keeps your runs small and your conclusions careful.

1

Run one user first

Use View Results Tree to confirm every request returns the right content. A chart of wrong answers is a chart of nothing.

2

Add assertions

Place content checks on important requests so failures are marked as failures, not as quick successes.

3

Run a handful of users

Try five to ten users for a minute or two. Watch the chart settle, and note the average, median, deviation, and throughput.

4

Change one thing

Modify one setting, such as the number of users, a pause, or a request. Clear the listener and run again.

5

Compare and record

Write down what changed and what happened. Small, careful experiments teach more than one giant run.

6

Retire the chart

When the script is stable, disable Graph Results and move to non-GUI mode with a results file.

Everyday analogy

A pilot flies a simulator many times before taking passengers aboard. The simulator is cheap and forgiving, and its job is to teach. Graph Results is your simulator display: ideal for practice, never the cockpit of a real flight.

i
Tip

Change one variable at a time. If you change the user count and a pause and a request all at once, you will never know which change caused what you see.

CCharts, Errors, and Assertions Together

A chart shows speed. Assertions show correctness. You need both.

Graph Results plots response times for every sample, whether the sample passed or failed. It does not tell you which dots were errors. A failed request that returned a quick error page draws a low dot, exactly like a healthy request. This is the single most important caution when reading the chart.

An example of a misleading chart

Suppose a login page starts failing because the database is overloaded. The server responds in thirty milliseconds with a polite error. The black dots move down, the average improves, and the chart looks better than before. In reality, every user is being turned away. Without a content check and an error rate, you would see a happy chart over a broken system.

Everyday analogy

A restaurant that closes its doors has no waiting line and an excellent service time of zero seconds. The numbers look wonderful, and the business is failing.

How to protect yourself

  • Add a Response Assertion or similar check to every important request, so wrong content marks the sample as failed.
  • Keep a second listener, such as a Summary Report, that shows an error percentage next to the response times.
  • Whenever the chart improves suddenly, ask first whether errors rose at the same moment.
  • Treat an unexplained improvement with the same suspicion as an unexplained decline.
!
Watch out

The green throughput line also counts failures. A sudden rise in throughput together with falling response times is a classic fingerprint of requests failing fast.

TTimers, Think Time, and What They Do to the Chart

Pauses change throughput without changing response time.

Real users do not click as fast as a machine. They read, think, and scroll. In JMeter, pauses between requests are added with elements called timers, and the pause itself is called think time. Timers delay the sampler they apply to, so each virtual user sends fewer requests per minute.

Effect on each line

LineEffect of adding think time
Data dotsNo direct change, since response time excludes the pause
Average and medianNo direct change, but they may improve indirectly because the server is less busy
DeviationMay shrink if the server is less stressed
ThroughputFalls, because each user completes fewer requests per minute
Everyday analogy

A cashier takes thirty seconds per customer. If customers arrive every minute, the cashier handles sixty customers an hour. If customers arrive every five minutes, the cashier handles twelve an hour with the same thirty seconds per customer. The service time did not change, but the throughput did.

Realism matters

A test with no think time sends the maximum possible load from each user. That is useful for finding limits, but it does not describe real life. A test with realistic pauses needs more virtual users to reach the same load, and it gives a more honest picture of daily traffic. Graph Results shows the effect clearly: the throughput line settles at a level set by the number of users and their pauses.

i
Production note

Choose think times from real analytics where possible, such as how long typical visitors spend on a page, instead of guessing. The more realistic the pause, the more meaningful the throughput you read from the chart.

SScalability: Big Tests and Distributed Testing

When one machine is not enough, listeners get even more expensive.

A single JMeter machine can generate a large load, but it has limits in processor power, memory, and network capacity. To go further, teams use distributed testing. One machine, called the controller, directs several other machines, called remote engines or workers, which each run the same plan and generate part of the load.

Where results go

In the usual setup, the workers send their sample results back to the controller, where listeners process them. This means a heavy listener on the controller must handle the combined stream from every worker. A listener that was comfortable with one machine’s results can drown under the results of ten machines.

Everyday analogy

Imagine ten delivery vans all reporting each parcel by radio to one dispatcher who must also paint a wall chart. The dispatcher becomes the bottleneck long before the vans do.

Ways to keep it healthy

  • Have each worker write its own results file locally and collect the files afterwards.
  • Use the sender modes that batch or summarise samples before sending them to the controller, where your version supports them.
  • Keep chart listeners off the controller during real runs.
  • Send metrics to an external time-series database for live viewing, instead of drawing them inside JMeter.
  • Watch the processor and memory of the controller as carefully as those of the workers.
i
Tip

Before a big distributed run, test the setup with a tiny number of users on each machine. Confirm that every worker reports results before you scale up.

MMonitoring, Logging, and Metrics Beyond the Built-in Chart

Live visibility in serious tests comes from outside JMeter.

JMeter includes a Backend Listener, which sends test metrics to an outside system while the test runs, instead of drawing them in a window. Common targets are time-series databases, which are databases designed to store numbers that change over time. A dashboard tool such as Grafana can then draw live charts from that database, on any screen, without costing the load generator the effort of painting.

flowchart LR
    LG["JMeter load generator, non-GUI"] --> BL["Backend Listener"]
    BL --> TS["Time-series database"]
    TS --> GD["Dashboard tool"]
    GD --> TEAM["Team watches live charts"]
    LG --> RF["Results file on disk"]
    RF --> HR["HTML dashboard report after the run"]
    SM["Server monitoring: CPU, memory, errors"] --> GD
FIG 4 · Live charts outside the generator, plus a report afterwards.

Why server metrics must sit beside JMeter metrics

Response times show that something is slow, but not why. The reason lies on the server: busy processors, full memory, exhausted connections, or slow database queries. A dashboard that shows load generator metrics beside server metrics lets you see cause and effect on the same timeline.

Everyday analogy

A patient’s temperature chart says there is a fever. Only blood tests, scans, and other measurements say why. A good clinic displays them together so the doctor can connect them.

What to log and what to watch

  • Response time percentiles, error counts, and throughput from the test.
  • Processor, memory, network, and disk of the load generator itself.
  • Processor, memory, connections, queue lengths, and slow queries on the server side.
  • A marker for when each test run started and stopped, so charts line up.
i
Production note

Whatever the tool, record the generator’s own health. A load generator running at ninety percent processor use is part of the experiment, not a neutral observer, and results from it should be treated with caution.

SSecurity: What Your Results Might Reveal

A chart looks harmless, but the file behind it may not be.

Graph Results itself shows only numbers, so the chart on screen carries little risk. The danger lies in the results files and any other data saved alongside them. Depending on the fields you choose to save, a results file can contain addresses of internal systems, user names, request data, response bodies, and sometimes tokens or cookies.

SECURITY CHECKLISTReview
Before the test

Decide which fields really need saving. Use test accounts and test data, never real customer information, and make sure you have permission to load the target system.

During the test

Write results to a protected folder. Avoid saving full responses and request bodies unless you truly need them for debugging.

After the test

Secure or delete results files, review report folders before sharing, and remove screenshots that show internal addresses or account names.

Other points to remember

  • Never aim a load test at a system you are not authorised to test. Heavy traffic can look like an attack and can cause harm.
  • Be careful when sharing a dashboard or a screenshot outside the team, since labels and addresses may reveal internal structure.
  • Protect the machines that run JMeter, because they hold your plans, data files, and sometimes credentials.
  • Remote engines in distributed tests communicate over the network, so keep them inside trusted networks and follow your organisation’s security guidance for that channel.
Everyday analogy

A hospital waiting-room display may show only queue numbers, which is safe. The paper files behind the desk hold names and medical details, which are not. Treat your result files like those paper files.

!
Watch out

A test with real credentials can lock real accounts, send real emails, or place real orders. Always use dedicated test data and a test environment where possible.

AAdvantages, Disadvantages, and Trade-offs

Every tool is a bargain, and Graph Results is a simple one.

Graph Results gives you speed of understanding in exchange for depth and scale. Seeing both sides honestly helps you pick it for the right job and drop it at the right time.

Advantages

  • Needs no setup, no files, and no extra software
  • Shows the shape of a run within seconds
  • Displays five measurements in one place
  • Easy for a beginner to read and explain
  • Good for spotting sudden changes during script building
  • Pairs well with View Results Tree in early debugging

Disadvantages

  • Expensive in memory and processor time at scale
  • Mixes all request types into one picture
  • No percentiles and no error percentage
  • Horizontal axis counts samples, not clock time
  • Live chart disappears when the window closes
  • Not suitable for reports, evidence, or sharing
Trade-offWhat you gainWhat you give up
Live chart instead of a fileInstant feedbackA permanent record
One chart for everythingSimplicityDetail per request
Calculating a medianA robust middle valueExtra memory
GUI modeVisibility and easeLoad generator capacity
Averages and a medianA quick summaryThe slow tail that percentiles reveal
Everyday analogy

A pocket calculator is quick, cheap, and perfect for small sums. You would not use it to run the accounts of a bank, and nobody blames the calculator for that. Graph Results is the pocket calculator of JMeter listeners.

i
Production note

The sensible rule is simple: use it to learn and debug, then replace it with files, reports, and external dashboards for real work.

DDesign Patterns and Anti-patterns

Good habits repeat, and so do bad ones.

Patterns that work

Pattern

Debug listeners behind a switch

Keep Graph Results and View Results Tree in a clearly named branch that is disabled by default, and enable them only while building.

Pattern

File first, charts later

Write a results file for every serious run and produce reports from it, so the run is cheap and the analysis is rich.

Pattern

One listener per question

Place a small listener near a single request you are studying, instead of one giant chart for the whole plan.

Pattern

Errors beside speed

Always pair a speed view with an error view, so quick failures cannot masquerade as good performance.

Anti-patterns to avoid

ANTI-PATTERN 01Avoid
The pattern

Leaving Graph Results enabled during a large test and watching the chart on screen.

Why it hurts

The chart consumes memory and processor time that the test needs, so the generator slows and the measurements become unreliable.

Better approach

Run in non-GUI mode, save a results file, and build a report afterwards.

ANTI-PATTERN 02Avoid
The pattern

Judging a whole system from the average line alone.

Why it hurts

Averages hide slow tails and outliers, so users may suffer while the blue line looks calm.

Better approach

Read the median, the deviation, and percentiles from a report, and look at the spread of the dots.

ANTI-PATTERN 03Avoid
The pattern

Mixing very different requests in one chart and drawing conclusions from the combined lines.

Why it hurts

A fast request and a slow request average into a number that describes neither, and real problems stay hidden.

Better approach

Use per-request tables or separate listeners placed inside the relevant controllers.

ANTI-PATTERN 04Avoid
The pattern

Not clearing the listener between runs and comparing the combined picture.

Why it hurts

Old and new samples mix, so averages and counts describe neither run.

Better approach

Clear results before each run and note the settings of every run.

TTroubleshooting Graph Results

When the chart looks strange, check these causes first.

SymptomLikely causeWhat to check
Chart stays emptyThe listener is not inside the scope of any sampler, or it is disabledIts position in the tree and its enabled state
Chart looks flat and squashedOne huge outlier stretched the vertical axisThe slowest sample and its cause
Numbers from the last run still showThe listener was not clearedUse the clear button before each run
JMeter becomes sluggishThe chart and other listeners are using too much memory or processorDisable listeners, reduce users, or switch to non-GUI mode
Throughput looks too lowThink time, slow responses, or too few usersTimers and the thread group settings
Throughput looks too goodRequests are failing quicklyAn error percentage from another listener
Chart changes between identical runsCold caches, other users on the server, or generator limitsWarm-up, shared environments, and generator health
Out-of-memory messageToo many samples held by listenersRemove heavy listeners and give JMeter a suitable memory setting
No median showsThe line is hidden by a display optionThe check boxes above the chart

A method for any puzzle

1

Reproduce it small

Run with one or two users and see whether the odd shape still appears.

2

Check the generator

Look at its memory and processor use before blaming the server.

3

Check correctness

Confirm with View Results Tree and assertions that responses are right.

4

Change one thing

Alter a single setting and run again to learn its effect.

i
Tip

Keep a short troubleshooting journal. The same three or four causes explain most odd charts, and a journal helps you spot them quickly next time.

AA Worked Example: Reading One Small Run

Follow an imaginary smoke test of a small web shop from start to finish.

A team has built a script that visits the home page, searches for a product, and opens its page. Before any big test, they run a small smoke test with ten users and a ramp-up of thirty seconds, lasting five minutes. They keep Graph Results enabled because the run is tiny.

flowchart TD
    A["Run 1 user with View Results Tree"] --> B{"All responses correct?"}
    B -- "No" --> C["Fix script and assertions"]
    C --> A
    B -- "Yes" --> D["Run 10 users with Graph Results"]
    D --> E{"Chart steady after ramp-up?"}
    E -- "Yes" --> F["Record numbers, disable chart listeners"]
    E -- "No" --> G["Investigate the shape using the pattern guide"]
    G --> D
    F --> H["Run in non-GUI mode with results file and report"]
FIG 5 · A small smoke test decides whether the script is ready for a real run.
1

Ramp-up

During the first thirty seconds, the dots start low and the green throughput line climbs as users arrive.

2

Steady state

From the second minute, the black dots form a narrow band. Average and median sit close together, the deviation is small, and throughput levels off.

3

A surprise

Around minute three, a handful of dots jump high. The average creeps up while the median barely moves. This suggests a few slow requests, not a general slowdown.

4

Following the clue

The team places a listener under the search request only. The slow dots belong to search, so they inspect that step with the tree and server logs.

5

Recording and moving on

They note the figures, fix the search issue, repeat the run, and confirm the spikes are gone.

What this teaches

  • The chart pointed to a problem within minutes, but did not name the cause.
  • The gap between average and median hinted at outliers rather than a general slowdown.
  • A narrower listener scope turned a vague worry into a specific suspect.
  • Once the script was stable, the team moved to non-GUI mode for larger runs.
i
Production note

This example is imaginary and simplified. Real investigations usually involve server logs, monitoring, and several repeated runs, but the habit of reading shape first and cause second is the same.

CCommon Misreadings of the Chart

Most mistakes come from reading the chart too literally.

Mistake

The axis is time

The horizontal axis follows the sequence of samples, not the clock, so spacing does not show how much time passed.

Mistake

Low dots mean success

A failed request can be quick. Low response time never proves a correct response.

Mistake

The average is typical

The average may match no real request, especially when a few samples are very slow.

Mistake

Throughput is capacity

Throughput shows what the system handled in this run, not necessarily the most it could handle.

Mistake

Flat means safe

A steady chart can hide steady failure. Pair it with an error rate.

Mistake

One run is proof

A single run can be affected by warm-up, neighbours, or luck. Repeat important tests.

Everyday analogy

Reading a chart is like reading a map. A map shows roads but not traffic jams, closures, or the mood of the drivers. Useful, but never the whole story.

A simple habit to avoid all six

Before you state a conclusion from the chart, ask three questions. Did the responses contain the right content? Is the generator healthy? Does the result repeat? If you can answer yes to all three, the conclusion is much more likely to hold.

!
Watch out

Never present a screenshot of this chart alone as evidence of system quality. Combine it with error rates, percentiles, and server metrics from a proper report.

BBest Practices and Common Mistakes

A short checklist to carry into your next test.

1

Use it for learning and debugging

Let Graph Results help while you build and validate the script, with small user counts.

2

Disable it for real runs

Turn off chart and tree listeners before serious tests and use non-GUI mode.

3

Write a results file

Keep a file of every important run, with a clear name and a date.

4

Read several measurements

Look at the dots, the median, the average, the deviation, and the throughput together.

5

Pair speed with correctness

Add assertions and watch an error percentage beside the chart.

6

Clear and compare carefully

Clear listeners between runs and change only one setting at a time.

7

Watch the generator

Monitor the memory and processor of the machine running JMeter.

Common mistakes in one list

  • Using Graph Results in a heavy load test, and distorting the results
  • Trusting the average alone and ignoring percentiles
  • Reading the horizontal axis as a clock
  • Forgetting to clear results between runs
  • Mixing all request types in a single chart
  • Celebrating a fast chart without checking errors
  • Leaving results files with sensitive data in shared folders
  • Running one test once and treating it as final
Watch the chart to learn, then measure with files to decide.

RReal-World Scenarios

Five typical situations, described in general terms so you can adapt them.

The new tester’s first script

A junior engineer builds a script for a company’s internal portal. Using View Results Tree with one user, she confirms every step works. Then she adds Graph Results and runs five users, quickly seeing that the search page is much slower than the others. She shows her senior colleague the chart and they decide which request to examine first.

The sale-day rehearsal

An online shop prepares for a big sale. The team begins with Graph Results to tune the script at small scale. For the real rehearsal, they switch to non-GUI mode on several machines, save results files, and build a dashboard report. The live chart is retired from the plan before the rehearsal.

The mysterious improvement

During a run, the chart suddenly improves: response times fall and throughput rises. Excited, the tester almost reports a win. A look at the error percentage shows that a back-end service had failed, and the application was returning quick error pages. The chart was cheerful because the system had stopped doing real work.

The slow creep

On a test lasting an hour, the dots slowly rise and the deviation widens. Server monitoring shows memory growing steadily. The team traces it to a component that never releases a resource. The chart did not give the cause, but it gave the first warning that something accumulates over time.

The overloaded controller

A team scales a test to many machines but leaves chart listeners enabled on the controller. The controller runs out of memory and the whole run is lost. After the incident, they move to local results files on each worker and external live dashboards, and they add a rule to the team checklist that reads: disable chart listeners before scaling.

The tool was fine. The job it was given was too big.

KKeeping the Load Generator Healthy

Your measurements are only as honest as the machine that takes them.

The load generator is the computer that runs JMeter and sends the requests. It is easy to forget that this machine is part of the experiment. If it is starved of memory or processor power, requests leave late, responses are handled late, and every time on the chart includes some of the generator’s own struggle. You would then be measuring your test machine, not the system under test.

Signs that the generator is struggling

  • The processor stays near its maximum for long stretches while the test runs.
  • The JMeter window becomes slow to respond, or the chart updates in jerky bursts.
  • Throughput stops rising even when you add more users, while the server shows spare capacity.
  • Out-of-memory messages appear, or the program pauses for long periods while it cleans up memory.
  • Results differ wildly between identical runs for no clear reason.
Everyday analogy

If you time a runner using a stopwatch that sticks, every result is wrong, and the runner gets the blame. A tired load generator is a sticky stopwatch.

Habits that protect the generator

Habit

Run it on a dedicated machine

Avoid running heavy office programs, video calls, or other tests on the same computer during a run.

Habit

Give it enough memory

JMeter runs on the Java platform, which has a configurable memory limit. Set it sensibly for the size of your test.

Habit

Stay close to the target

Place the generator on a fast, reliable network near the system under test, so network delay does not blur the picture.

Habit

Watch its health

Monitor processor, memory, and network of the generator during every run and record them with the results.

i
Tip

A simple sanity check is to run the same small test from two different machines. If the numbers agree, the generator is probably not the limit. If they differ a lot, investigate the weaker machine first.

GGraduating from Graph Results: A Growth Path

Every tester starts with a simple chart and grows into richer tools.

Graph Results is a good first teacher, but it is not meant to be the last tool you use. A common growth path helps you move step by step, so you never feel lost.

1

Stage one: see something

Use View Results Tree and Graph Results with a few users while building the script. The aim is to understand what the numbers look like.

2

Stage two: measure properly

Add assertions, write a results file, and use the Summary or Aggregate Report to see per-request figures, error percentages, and percentiles.

3

Stage three: run lean

Switch to non-GUI mode, remove chart listeners, and generate the HTML dashboard report after each run.

4

Stage four: watch live outside JMeter

Stream metrics through a Backend Listener to a time-series database, and display them on a dashboard next to server metrics.

5

Stage five: automate

Run tests from a build pipeline, compare results against agreed targets, and fail the pipeline when a target is missed.

Everyday analogy

A child learns to ride with stabiliser wheels, then rides freely, then joins a cycling club and eventually races. The stabiliser wheels were never a mistake. They were the right tool for the first stage, and removing them was a sign of progress.

What stays the same at every stage

The questions never change: how fast, how many, how often does it fail, and why? Each stage answers them with more care. Graph Results taught you to read the five basic measurements, and that knowledge carries straight over to every later tool, which will show the same ideas with more precision and less cost.

i
Production note

Agree on pass and fail targets before running a test, such as a limit for the 95th percentile and for the error rate. Targets turn a chart from an opinion into a decision.

CChoosing the Right Listener for the Question

Start with the question, and the tool usually chooses itself.

Beginners often ask which listener is the best one. The honest answer is that no listener is best, because each answers a different question. Before adding anything to the plan, write down in plain words what you want to know. Then match the question to the listener that was built to answer it.

The question you are askingA good first choice
Did this one request send and return what I expected?View Results Tree with a single user
How is the system behaving right now, roughly?Graph Results with a few users
Which request is the slowest, and how many failed?Summary Report or Aggregate Report
How slow is the slowest tenth of requests?Aggregate Report percentiles or the dashboard report
How did things change over the whole run?HTML dashboard report built from the results file
Can the team watch the run live, next to server metrics?Backend Listener with an external dashboard
Everyday analogy

A carpenter does not ask which tool is best. A hammer drives nails, a saw cuts wood, and a tape measure measures. Choosing the wrong tool does not make the tool bad, it only makes the job harder.

A calm way to decide

  • Write the question as one sentence before you open the Listener menu.
  • Choose the lightest listener that can answer it.
  • Place it as close as possible to the requests it should watch.
  • Remove or disable it when the question has been answered.
i
Tip

Fewer listeners are almost always better. Each one adds cost, and each one adds something else to read. Keep only those that earn their place.

QQuick Reference

A one-page summary you can keep next to your test plan.

TopicSummary
Black dotsResponse time of each sample
Blue lineRunning average of response times
Purple lineRunning median, the middle value
Red lineStandard deviation, the spread of times
Green lineThroughput, shown per minute
Horizontal axisSequence of samples, not clock time
Best useFunctional checks and debugging with few users
Not recommendedReal load tests, large distributed tests
Alternatives for real workResults file, non-GUI mode, HTML dashboard report, external dashboards
Always pair withAssertions and an error percentage
Clear before every runYes, to avoid mixing results

Five questions before pressing start

  • Am I building and debugging, or running a real test?
  • If it is a real test, have I disabled chart and tree listeners?
  • Am I writing a results file so I can analyse the run properly?
  • Do my requests have assertions, and will I see an error percentage?
  • Have I cleared old results and noted the settings of this run?

FFrequently Asked Questions

Quick answers to the questions beginners ask most often.

Q1What does the Graph Results listener do?
It plots the response time of every sample it receives and draws lines for the average, median, deviation, and throughput, with matching numbers underneath.
Q2What do the colours mean?
In the usual layout, black shows each sample, blue the average, purple the median, red the deviation, and green the throughput.
Q3Is the throughput per second or per minute?
Graph Results presents throughput per minute. Divide by sixty if you want requests per second.
Q4Why does the documentation warn against using it in load tests?
Because it uses a lot of memory and processor time. The load generator should spend its effort sending requests, not drawing charts.
Q5What should I use instead during a real load test?
Run in non-GUI mode, write a results file, and generate the HTML dashboard report afterwards. For live viewing, send metrics to an external dashboard.
Q6Does the chart show errors?
No. It plots response times for all samples, passed or failed. Use assertions and a summary or aggregate report to see errors.
Q7Why is the average so different from the median?
A few very slow samples pull the average upward, while the median stays near the middle. A large gap usually means outliers.
Q8Does it show percentiles?
No. For the 90th, 95th, and 99th percentiles, use the Aggregate Report or the HTML dashboard report.
Q9Can I place it under one sampler?
Yes. A listener under a single sampler receives only that sampler’s results, which gives a focused chart.
Q10How do I start a fresh chart?
Use the clear button on the toolbar before each run, so old samples do not mix with new ones.
Q11Does it work in non-GUI mode?
A chart cannot be drawn without a window, so it is of no use there. If the listener is enabled, it still adds some overhead, which is another reason to disable it.
Q12Why is the throughput so high when the site is failing?
Throughput counts all finished requests, including failures. Quick error responses can make it look healthy.
Q13Is Graph Results good for reports?
Not really. It disappears when the window closes. Save a results file and build the dashboard report for anything that must be shared or kept.
Q14How many users can it handle?
There is no fixed number, because it depends on your machine, memory settings, and test design. Keep it to small runs and move to files and reports as soon as the load grows.

SSummary and Key Takeaways

The Graph Results listener is a friendly window into a running test. It draws every sample as a dot and adds lines for the average, median, deviation, and throughput, so you can feel the shape of a run within seconds. Its simplicity is its strength for beginners and its weakness at scale. Use it to learn, to build, and to debug with a few users. Then move to non-GUI mode, results files, and reports for the real work. If you remember one idea, let it be this: a chart tells you how things look, and only correct content, error rates, and server metrics tell you how things are.

Key Takeaways

  • It is a live chart of response times. Black dots show each sample, with lines for average, median, deviation, and throughput.
  • Read several lines together. The gap between average and median hints at outliers, and the red line shows how consistent the system is.
  • The chart does not know about errors. Quick failures draw low dots, so pair it with assertions and an error percentage.
  • Throughput includes failures and delays. Treat a sudden rise with suspicion and read it beside the error rate.
  • Do not use it in real load tests. The official advice is that it costs memory and processor time, which distorts the very results you want.
  • Use better tools for serious work. Run in non-GUI mode, save a results file, build the HTML dashboard report, and stream live metrics to an external dashboard.
  • Protect the data. Treat results files as sensitive, use test accounts, and run only against systems you are allowed to test.