Skip to content

Analysis Tips

On this page, we will explore the most important information you should look at on the report. These tips will help you quickly analyze your test report and make the most out of it.

Note that we try to cover the most common use cases but may have missed some of them. Feel free to report any other use case to us through the chat or

Response times

Obviously response times are going to be our first stop. A lot of default graphs will display key information on response times in OctoPerf.

The most common one is the Hits and response time graph:

Hits and response time

It shows the average response time across all containers (pages or transactions) for the whole test. The one above is from a test that was successful, we can tell since the response time remained steady during the entire test.

Still, there may be additional things to check since a steady response time does not means it was acceptable. This is what we're going to explore here.

Global average response time

The global response time is a very good way to spot obvious issues. Whenever the curve looks like this, you know something is wrong: Global response time increase

Here we clearly see that after 16:21 the response times increases. It may not have reached a critical point yet but you've reached an inflection point and it is not likely to get any better later on. Investigate for any event around that time, in particular on your server monitoring.

Request or containers response times

OctoPerf shows the average containers response time by default but you can change that by editing the graph. Be careful since average container response times include the response times of scripts and also technical elements like if and while. Because of that this time may be very high, for instance when you have a while that runs for a very long time.

Instead it could be more relevant to look at average request response time. I say "may" because the average value across many requests may be very low and could hide problems because of that. In the end it is critical to always look at transaction response times.

Step by step response times

Here my recommendation is to check the result table. Look for transactions that stand out by sorting by highest average response time: Highest average response time

A good practice is to put these on a dedicated graph to see if they are always high or if there is another inflection point: Highest average response time


You can spot them even faster using our built-in SLAs.

Min and max response times

Don't forget that you can also look at min and max response times. Obviously that will give you insight on the best and worst transaction times. If you notice an important difference, you should go have a look at percentiles.

Hit rate

The hit rate is closely related to response times. The Hit rate means how many of this request or container am I running each second.

When you see only hits it usually refers to the total number of times a request or container was run during the test.

Now it's easy to understand that when the response times get higher, you virtual users have to wait longer for a response and thus generate less hits overall.

This can take many forms but in general the global hit rate should follow the amount of users running. When it doesn't it means there was a problem with the application, usually an increase of response times. Sometimes the increase is small and barely noticeable but it's easier to notice on the hits rate.

On this example: Hit rate slows down

We can see that after 16:21 the hits do not increase as fast as the number of users. This clearly indicates that the application is getting slower. This means you must now analyze response times and find out if they were too high. But in any case you've spotted an inflection point that you should investigate.

Error rate

The error rate is often overlooked but it is also an important metric. There are mostly two types of situations:

  • Peaks of errors
  • Recurring errors

We'll see what we can deduce from each one of these and also how to go further.

Peak of errors

A peak of error would typically look like this: Peak of errors

We can see two peaks during this test. Notice how the hit rate matches the error rate.

This is usually because the server is overloaded and answers all requests quickly but with an error. In which case, all pending requests get an answer over a short period but that answer is an error message. If you do not look at the error rate you might think that the application is doing better when it's the opposite.

Recurring errors

Some other times you may see recurring errors like this: Recurring errors

See how a small amount of errors occurs every 5 minutes? There are two explanations possible here:

  • Your test scripts do something invalid every 5 minutes. Try to run another test using random think times inside your test scripts. This way errors will not be synchronized anymore.
  • The infrastructure or application have a batch or protection that activates on a regular basis. Check for firewalls and proxies, also automatic tasks triggered by a recurring event that may cause this.

To go further you can have a look at the error rate per container or transaction and see if one of them stands out.

Step by step errors

To see the error rate of a particular container, a good first step is to sort the result table by highest number of errors: High error rate

In this example we can see that some transactions fail all the time whereas others do not. It is already a good indication of what might be the issue. Try to confront that with server logs, check what the failing steps do in the application and you should have a good idea of what's the issue.

Overall errors

You should also check the error section of the report for the percentage of response codes per type. If a 4XX or 5XX code represents more than a few percent of the total response codes it is worth investigating. Another possibility is that you get "none" as an error code a lot like here: Overall errors

This means that the underlying JMeter engine raised a Java error instead of getting a response. The most common situation is that there was a timeout or the remote server was not able to answer your request. You can find out by opening the error details in the Error table below: Error details

Latency and connect time

Latency and connect time are also often overlooked.

They are subsets of the response time, that correspond to specific events: Latency

Latency is the time until we receive the first byte and connect time is how long it took to initiate the HTTP connection.

Connect time increase

When the connect time increases like this: Connect time increase

It means that reaching the application is taking longer and longer. It usually points to a network issue, but keep in mind that connect time also includes SSL handshake and other technical operations.

So you need to consider if the majority of the time is spent waiting for a connection. If so it might be an SSL issue.

If instead it gets worse when you add load, it is probably a network issue. If so you should see connection reset errors or timeouts.

Latency increase

When the latency increases: Latency increase

It means that you spend more and more time waiting for your servers to answer. So obviously the issue here is that your server is overloaded. You need to check your server monitoring to find out why. The good thing is that you can rule out any netwrok related issue for now.

Response time increase

When the response time is very high compared to the latency like here in the beginning of the test: Response time increase It means you are spending time downloading the response content whereas the servers have already prepared it. So here we can tell the issue is network related and not on the servers themselves. Later we see that the latency increases as well, indicating that the server is also slowing down after a while.


Throughput can also tell us a lot about the application under test.

In this example we can see that most of the bandwidth is composed of images: Throughput images

In this situation, if you want to reduce the bandwidth used and also the download time, there are a few solutions available:

  • Use an in-memory caching solution to deliver resources faster.
  • Use a CDN to deliver resources from a source close to each user.
  • Optimize the size of your images. There are many possibilities here and most of them allow for lossless compression that can reduce size significantly.

You may also have noticed that other resources like JS or CSS can take a lot of bandwidth: Throughput js This could mean that you did not minify or compress these files. Minification is a good way to save a lot of space by removing all unnecessary characters. Add some compression on top of it and you can reduce by a factor of at least 10 the size of these files. Some systems have what is called a production mode that will take care of this once activated, make sure to do so.

While this is being done, you may want to consider running another test without clearing the cache on each iteration, that way the impact of these resources on the bandwidth will be lowered.

Standard deviation and percentiles

Average values are a good start but going further it is important to also rely on variance/deviation and percentiles.

First deviation shows us if response times are very different to each others. What's interesting is not the value in itself, but the trend: Deviation

We clearly see that it is getting worse near the end of the test.

A quick look at the result table can also tell us if the deviation is high when average and percentile are very different: High percentiles

In this case 90th percentile is close to twice the average.

And another interesting graph is Response Times Repartition: Percentiles

Again we can see a high disparity in response times. This indicates that the application behavior is very unstable.

Even if you consider at least some of these response times ok, users will have a very different experience. And a good portion of them will have very high response times. It is important to spot this and fix it before releasing the application in production.