{"id":6410,"date":"2024-11-01T09:03:27","date_gmt":"2024-11-01T13:03:27","guid":{"rendered":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/?p=6410"},"modified":"2025-04-04T10:02:50","modified_gmt":"2025-04-04T14:02:50","slug":"identifying-web-server-load-testing-bottlenecks-in-scatter-plots","status":"publish","type":"post","link":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/2024\/11\/identifying-web-server-load-testing-bottlenecks-in-scatter-plots\/","title":{"rendered":"How to Find Hidden Web Server Load Testing Bottlenecks in Scatter Plots"},"content":{"rendered":"<p>If you&#8217;ve been using average page load data to evaluate your website&#8217;s performance, you could be missing important bottlenecks that are reducing your conversion rates and causing customers to have a frustrating experience. \u00a0While averages are easy to understand, they cover up all of the details. After all, if the average load time of a page is 2 seconds, many users are seeing load times slower than that, but we don\u2019t know exactly how slow. The industry standard of expressing site performance in percentiles is technically accurate, but also doesn\u2019t give a full picture.<\/p>\n<p>Here&#8217;s a good example. \u00a0A recent client, a high-end retailer, showed excellent average page load times. \u00a0It looks like there wasn&#8217;t any slowdown at all in terms of page load times as the load increased to 2,250 concurrent users.<\/p>\n<p><a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-01-at-2.16.00\u202fPM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-6418\" src=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-01-at-2.16.00\u202fPM.png\" alt=\"\" width=\"600\" height=\"440\" \/><\/a><\/p>\n<p>What the average was covering up was a much wider range of response times than you&#8217;d imagine just by looking at the above chart. \u00a0That&#8217;s why we added scatter plots to\u00a0<a class=\"article-editor-content__link article-editor-content__link\" href=\"http:\/\/www.webperformance.com\/load-testing-tools\/pro-features.html\" rel=\"noopener noreferrer\">Web Performance Load Tester<\/a> and you can of course generate them in most modern load testing tools.\u00a0They plot every singe web page response time in a test, or can be focused on a single test case or even a single web page.<\/p>\n<p>\ufffc<a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2024\/10\/Image-10-31-24-at-12.43\u202fPM.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-6411\" src=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2024\/10\/Image-10-31-24-at-12.43\u202fPM.jpg\" alt=\"\" width=\"600\" height=\"332\" \/><\/a><\/p>\n<p>These plots provide us with a readily comprehensible overview of the range of web page load times seen by customers in different parts of the website. \u00a0While the average web page load time was fast, in reality the all important checkout and shopping cart process had a substantial number of responses within the 5-15 second range even at low load levels! \u00a0If you had relied on just the average load times you would have missed that all important detail that could be driving down the sales conversion rate and costing the company sales.<\/p>\n<p>Another troubling concern is the spikes circled in red. When the scattered load times bunch up in recognizable vertical lines, it is an artifact of how web page response times are measured. A web page response time is only recorded once the page has fully loaded. Prior to this, the page\u2019s loading time remains unknown. First, one user requests a page that the back end cannot serve, followed by another and another. The first bottleneck in the image above spans 35 seconds, indicating that the cause of the non-responsive page took 35 seconds to unblock itself and return the page content. Once this happened, the blocked page was served to all of the waiting users at once, creating the vertical stack pattern.\u00a0 The first user to request the blocked page waits the longest, the second a little less, etc, and the most recent user may not wait that much time at all. But no matter how long they waited, they all saw the page update at approximately the same time.<\/p>\n<p>You\u2019ll see the scattered load times line up like this when a call to a webpage\u2019s back end, whether directly to the database or an application server, is blocked. Often, this occurs due to a locked database table, but it can also result from any type of failure at any level. In this particular example, the servers were at about 40% CPU load when the blocks started occurring, so the problem wasn\u2019t server capacity.<\/p>\n<p>Some typical causes of a blocked\/locked page:<\/p>\n<ul>\n<li>Locked DB tables<\/li>\n<li>Load balancer sending too much load to one server while the rest are lightly loaded<\/li>\n<li>One of the servers in a cluster has crashed<\/li>\n<li>Dynamic server scaling taking too long<\/li>\n<li>Severe network congestion or failure<\/li>\n<\/ul>\n<p>Once you know there is something blocking a web page or API call for long periods of time, the next step is to work with the rest of the DevOps team to comb through logs and monitoring tools to try and find the source of the block. A lot of the time, it\u2019s a DB query that locked a table, which is easy for a DBA to check, but finding solutions to other problems will take more time to pinpoint the exact cause.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you&#8217;ve been using average page load data to evaluate your website&#8217;s performance, you could be missing important bottlenecks that are reducing your conversion rates and causing customers to have a frustrating experience. \u00a0While averages are easy to understand, they cover up all of the details. After all, if the average load time of a page is 2 seconds, many users are seeing load times slower than that, but we don\u2019t know exactly how slow. The industry standard of expressing site performance in percentiles is technically accurate, but also doesn\u2019t give a full picture.<br \/>\nHere&#8217;s a good example. \u00a0A recent client, &hellip; <a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/2024\/11\/identifying-web-server-load-testing-bottlenecks-in-scatter-plots\/\">Continue reading &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,41,42],"tags":[],"class_list":["post-6410","post","type-post","status-publish","format-standard","hentry","category-load-testing","category-performance-reports","category-load-tester-software"],"_links":{"self":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts\/6410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/comments?post=6410"}],"version-history":[{"count":8,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts\/6410\/revisions"}],"predecessor-version":[{"id":6421,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts\/6410\/revisions\/6421"}],"wp:attachment":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/media?parent=6410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/categories?post=6410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/tags?post=6410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}