LoadForge LogoLoadForge

How to Read a Load Test Report: Every Metric Explained

How to Read a Load Test Report: Every Metric Explained

Why Reports Matter More Than Running Tests

Running a load test is the easy part. You pick a tool, write a script, point it at your application, and press go. The hard part — and where the real value lives — is interpreting the results correctly.

A load test report is a dense collection of numbers, charts, and distributions that together tell the story of how your application behaves under pressure. Misreading that story leads to false confidence ("our average response time is fine!"), missed bottlenecks, and production outages that could have been prevented.

This guide walks through every major metric you will encounter in a load test report, explains what each one actually means, and shows you how to avoid the most common interpretation mistakes. Whether you are using LoadForge, Locust, or another load testing tool, the fundamentals are the same. By the end, you will be able to look at a report and quickly identify whether your application is healthy, where it is struggling, and what to fix first.

Anatomy of a Load Test Report

A typical load test report contains the following components:

  • Summary statistics — aggregate numbers like average response time, total requests, and overall error rate
  • Response time metrics — average, median, percentiles (p95, p99), min, and max
  • Throughput — requests per second over the duration of the test
  • Error rate — the percentage and types of failed requests
  • Concurrent users over time — how many virtual users were active at each point
  • Time-series charts — response time, throughput, and errors plotted over the test duration
  • Per-endpoint breakdown — metrics for each individual URL or API endpoint tested

Each of these tells a different part of the story. Let us break them down one by one.

Response Time Metrics

Response time — the duration between sending a request and receiving the complete response — is the most scrutinized metric in any load test report. But a single response time number is almost meaningless without context. What matters is how response times are distributed across all requests.

Average Response Time

The average response time (or mean) is calculated by summing all response times and dividing by the number of requests. It is the most commonly reported metric and, paradoxically, one of the least useful when viewed in isolation.

The problem with averages is that they are highly sensitive to outliers. Imagine 99 requests that complete in 100ms and one request that takes 10,000ms. The average is 199ms — a number that describes almost no one's actual experience. The 99 fast users had a 100ms experience. The one slow user had a 10,000ms experience. The "average" user with a 199ms experience does not exist.

Averages are useful as a general trend indicator — if the average is climbing over the course of a test, something is degrading. But never rely on them alone.

Median (P50)

The median, also called the 50th percentile (p50), is the response time at which exactly half of all requests were faster and half were slower. It is far more representative of the "typical" user experience than the average because it is not skewed by outliers.

In the example above (99 requests at 100ms, one at 10,000ms), the median would be 100ms — which accurately reflects what most users experienced. When someone asks "how fast is the application?", the median is usually the best single number to cite.

P95 and P99

If the median tells you about the typical user, the 95th percentile (p95) and 99th percentile (p99) tell you about the users having a bad time.

The p95 value means that 95% of all requests completed faster than this time. Put differently, 1 in every 20 users experienced this response time or worse. The p99 means 99% were faster — only 1 in 100 users had it this bad.

Why do these matter more than the average? Because at scale, the tail latency affects a lot of people. If your application handles 100,000 requests per hour, a p99 of 5,000ms means 1,000 requests per hour are taking five seconds or more. Those are real users having a genuinely terrible experience. High-percentile latency is also often the first indicator of an emerging bottleneck — tail latency climbs before the median does.

PercentileWhat It RepresentsWho It Affects
p50 (Median)The typical experienceHalf of all users
p90Getting into the slow tail1 in 10 users
p95Meaningfully degraded experience1 in 20 users
p99Worst "normal" experience (excluding true outliers)1 in 100 users

Many SLAs and internal performance targets are defined in terms of p95 or p99 rather than averages, precisely because they capture the experience of users in the tail.

Min and Max

The minimum response time represents the fastest request in the entire test. It is useful mainly as a sanity check — it tells you the theoretical best your application can do under the test conditions.

The maximum response time is the single slowest request. It is often an edge case — a request that hit a cold cache, triggered a garbage collection pause, or landed on an overloaded server. The max is not statistically significant on its own, but consistently extreme max values (e.g., 30-second timeouts) can indicate serious problems like connection pool exhaustion or deadlocks.

Together, min and max define the range of response times. A narrow range (min: 80ms, max: 400ms) suggests consistent performance. A wide range (min: 50ms, max: 25,000ms) indicates high variability, which warrants investigation even if the median looks acceptable.

Throughput (Requests Per Second)

Throughput measures how many requests your application processes per second (often abbreviated as RPS or req/s). It is the capacity metric — while response time tells you how fast each request is handled, throughput tells you how many requests can be handled simultaneously.

In a well-behaved system, throughput scales roughly linearly with the number of concurrent users — double the users, double the RPS. This continues until the system hits a capacity constraint (CPU, memory, database connections, network bandwidth). At that point, throughput plateaus: adding more users does not increase RPS, it only increases response times as requests queue up.

This plateau is one of the most important signals in a load test report. It tells you the maximum sustained capacity of your system. If throughput flattens at 500 RPS while you are ramping from 200 to 400 users, your system's ceiling is 500 RPS. Pushing beyond that means users will experience queueing delay, and response times will begin to climb.

When reading throughput data, look for:

  • Linear scaling region — throughput increases proportionally with users. This is the healthy operating range.
  • Plateau — throughput stops growing. You have hit a bottleneck somewhere.
  • Decline — throughput actually drops as users increase. This is a sign of serious trouble — the system is spending more time on overhead (context switching, retries, error handling) than on productive work.

Error Rate

The error rate is the percentage of requests that resulted in a failure — typically HTTP 4xx or 5xx status codes, timeouts, or connection errors. It is one of the clearest indicators of whether your system is healthy under load.

What is acceptable? This depends on your application, but as a general rule:

Error RateAssessment
< 0.1%Excellent. Normal for a healthy system.
0.1% - 1%Acceptable for most applications, but investigate the errors.
1% - 5%Problematic. Users are being affected. Identify the cause.
> 5%Critical. The system is not handling the load.

Not all errors are equal. Distinguishing between error types is essential:

  • 4xx errors (client errors) may indicate issues with your test script (bad URLs, missing authentication) rather than server problems. Review these to make sure they are not test artifacts.
  • 5xx errors (server errors) are genuine failures — the server could not fulfill the request. These are the ones that matter most. Look for 502 (bad gateway), 503 (service unavailable), and 504 (gateway timeout), which often indicate upstream services or reverse proxies failing under load.
  • Timeouts occur when the server takes longer than the configured timeout to respond. They are effectively extreme latency that crosses a threshold.
  • Connection errors mean the client could not establish a connection at all. This often indicates that the server's connection limits are exhausted.

Error rate over time is as important as the aggregate number. An error rate that is zero for the first 10 minutes then spikes to 15% tells a completely different story than a steady 2% throughout. The sudden spike usually correlates with hitting a capacity limit — connection pool exhaustion, memory limits, or a dependent service failing.

Concurrent Users / Virtual Users

Concurrent users (or virtual users, VUs) represents the number of simulated users actively sending requests at any given moment. This metric is important context for interpreting everything else in the report.

A response time of 500ms means something very different at 50 concurrent users than at 5,000. Throughput of 200 RPS is excellent if you only have 100 virtual users but concerning if you have 2,000 (it would mean each user is only completing one request every 10 seconds).

Most load tests use a ramp-up pattern: starting with a small number of users and gradually increasing to the target. This is deliberate — it lets you observe how each metric changes as load increases, making it easy to identify the exact point where performance begins to degrade.

When reading the concurrent users chart, pay attention to:

  • The ramp-up shape — linear ramps are most common, but step functions can make inflection points easier to spot.
  • Correlation with other metrics — overlay the user count with response time and error rate. The point where response times start climbing or errors appear tells you your effective capacity.
  • The relationship to real traffic — if your production analytics show a peak of 1,000 concurrent users, test to at least 1,500-2,000 to have a safety margin.

Response Time Over Time

If you only look at one chart in your entire report, make it this one. The response time over time chart — plotting response times (usually p50 and p95 or p99) on the Y-axis against test duration on the X-axis — is the single most informative visualization in a load test report.

This chart reveals the hockey stick curve, the characteristic pattern where response times hold steady for a period and then spike sharply upward. The inflection point — where the curve bends from flat to steep — marks the transition from healthy operation to overloaded operation.

Here is how to read it:

  • Flat region at the beginning. Response times are stable. The system is operating within its capacity. This is the safe zone.
  • Gradual upward slope. Response times are increasing slowly. The system is approaching its limits. You have some headroom but not much.
  • Sharp upward spike (the hockey stick). The system has exceeded its capacity. Requests are queueing faster than they can be processed. This is where user experience degrades rapidly.
  • Spikes and sawtooth patterns. If response times spike periodically rather than climbing steadily, you may be seeing garbage collection pauses, periodic batch jobs, or auto-scaling events. These patterns have different causes and different solutions than a simple capacity limit.

Correlate this chart with the concurrent users chart. The number of users at the inflection point is your effective capacity under the test conditions.

Response Time Distribution

While the time-series chart shows how latency changes over the test duration, the response time distribution (typically shown as a histogram) shows how latency is distributed across all requests regardless of when they occurred.

A healthy distribution is narrow and concentrated around a single peak. Most requests cluster around the median, with a small tail trailing off to the right. This means your application performs consistently — most users get a similar experience.

An unhealthy distribution has one or more of these characteristics:

  • A long right tail — most requests are fast, but a significant minority are very slow. This suggests intermittent bottlenecks (slow database queries, garbage collection, cold caches).
  • A bimodal distribution (two distinct peaks) — some requests are fast and others are slow, with few in between. This often indicates that two distinct code paths are being exercised (cached vs. uncached, indexed vs. unindexed queries) and should be investigated by endpoint.
  • A wide, flat distribution — response times are all over the map. Performance is unpredictable. This typically points to resource contention or an overwhelmed system.

Requests by Endpoint

Aggregate metrics are useful for understanding overall system health, but per-endpoint metrics are where you find actionable optimization targets. Your load test report should break down response times, throughput, and error rates for each individual endpoint or request type.

When reviewing per-endpoint data, look for:

  • Slow outliers. If nine endpoints respond in under 200ms but one takes 3,000ms, that endpoint is your optimization priority. It might have a missing database index, an N+1 query problem, or an unoptimized external API call.
  • High error rates on specific endpoints. An endpoint with a 10% error rate while others are at 0% narrows your debugging scope significantly.
  • Relative throughput. Endpoints with high throughput and high latency have the most impact on overall performance. Optimizing a slow endpoint that handles 50% of all traffic delivers more value than optimizing one that handles 2%.

Putting It All Together

Let us walk through a realistic example. You have run a load test against your web application with the following configuration: ramp from 0 to 500 virtual users over 5 minutes, hold at 500 users for 15 minutes, then ramp down over 2 minutes.

Here are the results:

MetricValue
Total Requests142,387
Average Response Time487ms
Median (p50)210ms
P951,840ms
P994,320ms
Max12,450ms
Throughput (peak)612 req/s
Error Rate2.3%

What does this tell you?

First, notice the gap between the average (487ms) and the median (210ms). The average is more than double the median, which tells you the distribution is heavily right-skewed — a significant number of slow requests are pulling the average up. The median of 210ms suggests that the typical user experience is acceptable, but the p95 of 1,840ms means 1 in 20 users waited nearly two seconds, and the p99 of 4,320ms means 1 in 100 waited over four seconds. That is not great.

Second, the error rate of 2.3% is above the comfort threshold. At 142,387 total requests, that is roughly 3,275 failed requests. You need to check whether those errors are concentrated at a specific point in the test (likely when user count was highest) and which endpoints are failing.

Third, look at throughput. Did it plateau during the 500-user hold period, or was it still climbing? If it plateaued at 612 req/s while users were still ramping, your system hit its ceiling before reaching 500 users. The response time data supports this — the sharp jump from p50 to p99 suggests queueing under load.

The action items from this report:

  1. Investigate the p99 tail latency — what is causing 1% of requests to take 4+ seconds?
  2. Identify which endpoints are producing the 2.3% error rate and at what user count the errors begin.
  3. Determine the actual capacity ceiling by finding the inflection point in the response time over time chart.
  4. Run a second test at a lower user count (e.g., 300) to verify stable performance within capacity.

Common Misinterpretations

Even experienced engineers make mistakes when reading load test reports. Here are the most common pitfalls:

  • Celebrating a good average while ignoring percentiles. An average response time of 200ms sounds great until you realize the p99 is 8,000ms. One in a hundred users is having a terrible experience, and at scale that adds up fast.

  • Not correlating metrics with user count. Response times and error rates only have meaning in the context of how many users were active. Always overlay metrics with the concurrent user chart.

  • Testing for too short a duration. A 2-minute test at peak load is not enough. Many problems — memory leaks, connection pool exhaustion, cache eviction — only manifest after sustained load. Hold your peak load for at least 10-15 minutes.

  • Ignoring server-side metrics. Your load test report tells you what happened from the client's perspective. To understand why, you need server metrics: CPU utilization, memory usage, database connection counts, disk I/O, and network traffic. Always collect both.

  • Comparing results from different environments. A load test against your staging environment with a small database tells you nothing about production performance with a large database. Environment parity matters.

  • Treating every error as equal. A 404 from a misconfigured test URL is very different from a 503 under load. Classify errors before counting them.

  • Assuming the test fully represents production. Load tests simulate user behavior, but real traffic includes bots, crawlers, long-tail URLs, and usage patterns you may not have modeled. Treat load test results as a lower bound on production complexity.

Conclusion

A load test report is not just a collection of numbers — it is a diagnostic tool that reveals your application's performance characteristics, capacity limits, and hidden bottlenecks. The key to reading it well is understanding what each metric measures, how metrics relate to each other, and which ones deserve the most attention.

Focus on percentiles over averages. Watch for the hockey stick inflection point in your time-series charts. Correlate everything with the concurrent user count. Investigate per-endpoint breakdowns to find optimization targets. And always supplement client-side metrics with server-side observability data.

For hands-on guidance on setting up your first load test, see our load testing tutorial. For a broader overview of the discipline, start with what is load testing.

Try LoadForge free for 7 days

Set up your first load test in under 2 minutes. No commitment.