{"id":1151,"date":"2026-09-17T02:01:11","date_gmt":"2026-09-17T02:01:11","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=1151"},"modified":"2026-10-13T22:04:09","modified_gmt":"2026-10-13T22:04:09","slug":"load-average-vs-cpu-saturation-vps-monitoring","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/","title":{"rendered":"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Load average is the single most misread number on a VPS. It counts runnable and uninterruptible (D-state) tasks over 1, 5 and 15 minutes \u2014 it does <em>not<\/em> measure CPU utilisation, and it is not normalised by core count. A load of 4 on a 2-vCPU box is saturated; a load of 4 on an 8-vCPU box is healthy. This article shows how to read the pair together so you stop chasing the wrong metric.<\/p><h2 class=\"wp-block-heading\">What load average actually counts<\/h2><ul class=\"wp-block-list\"><li>Runnable threads waiting for CPU (<code>R<\/code> state).<\/li><li>Threads in uninterruptible sleep (<code>D<\/code>) \u2014 usually blocked on disk or NFS, not CPU.<\/li><li>Load is not divided by cores; you must do that yourself.<\/li><\/ul><p class=\"wp-block-paragraph\">The killer ambiguity: <code>D<\/code>-state threads inflate load while the CPU sits 30% idle. Seeing load climb with low CPU means you have an I\/O problem, not a CPU problem.<\/p><h2 class=\"wp-block-heading\">Separate the two sources<\/h2><pre class=\"wp-block-code\"><code># 1-min load and core count\ncat \/proc\/loadavg\nnproc\n\n# who is actually runnable vs blocked\nvmstat 1 5\n#  r = runnable (needs CPU); b = blocked (waiting on I\/O)\n\n# per-CPU utilisation\nmpstat -P ALL 1 3<\/code><\/pre><p class=\"wp-block-paragraph\">Read <code>vmstat<\/code> columns as: high <code>r<\/code> with high <code>us<\/code>\/<code>sy<\/code> = CPU saturation. High <code>b<\/code> with high <code>wa<\/code> = I\/O saturation. High <code>r<\/code> with modest CPU use and rising <code>cs<\/code> = too many context switches, often a threaded app making cheap decisions too often.<\/p><figure class=\"wp-block-table\"><table><thead><tr><th>Signal<\/th><th>Likely cause<\/th><th>Next command<\/th><\/tr><\/thead><tbody><tr><td>r > cores, us+sy ~100%<\/td><td>CPU bound<\/td><td>perf top, see CPU hotspot profiling<\/td><\/tr><tr><td>b > 0, wa high<\/td><td>Disk I\/O wait<\/td><td>iostat -x 1, iotop<\/td><\/tr><tr><td>r high, us low, cs high<\/td><td>Context-switch thrash<\/td><td>pidstat -w 1<\/td><\/tr><tr><td>steal (st) > 0<\/td><td>Noisy neighbour \/ host contention<\/td><td>mpstat, understand CPU steal time<\/td><\/tr><\/tbody><\/table><\/figure><p class=\"wp-block-paragraph\">That last row is specific to virtualised hosts and never appears on bare metal: CPU time stolen by the hypervisor shows as <code>st<\/code> in <code>mpstat<\/code> and explains load you cannot account for. If you are budgeting cores for a workload, the <a href=\"https:\/\/virtualserversvps.com\/blog\/diagnosing-cpu-steal-time-vps-noisy-neighbor\/\">CPU steal diagnostic walkthrough<\/a> shows how to confirm host-side contention before you size up.<\/p><h2 class=\"wp-block-heading\">Normalising load for core count<\/h2><pre class=\"wp-block-code\"><code># quick saturation ratio: load1 \/ nproc\nawk '{print \"load1\/ncpu =\", $1\/'$(nproc)'}' \/proc\/loadavg\n# &gt; 1.0 sustained =&gt; queueing; &gt; 2.0 =&gt; severe<\/code><\/pre><p class=\"wp-block-paragraph\">Use the ratio, not the raw number, in alerts. A threshold of <em>load &gt; 4<\/em> is meaningless without knowing <code>nproc<\/code>. Define alerting as <code>(load1 \/ ncpu) &gt; 1.0 for 5 min<\/code>, then split the follow-up by whether <code>wa<\/code> or <code>us+sy<\/code> dominates.<\/p><h2 class=\"wp-block-heading\">Building a saturation-based alert<\/h2><pre class=\"wp-block-code\"><code># PSI gives a direct 'some tasks are stalled' signal (Linux 4.20+)\ncat \/proc\/pressure\/cpu\ncat \/proc\/pressure\/io\n# avg10=45.00 =&gt; 45% of the last 10s had tasks stalled on that resource<\/code><\/pre><p class=\"wp-block-paragraph\">Pressure Stall Information is a better alert input than load because it directly measures the fraction of time work was delayed. Load tells you a queue exists; PSI tells you how much it is hurting. For a low-core instance, wire both into monitoring and treat load as context, not the trigger.<\/p><p class=\"wp-block-paragraph\">Put together: check <code>nproc<\/code>, look at <code>vmstat<\/code> to split runnable from blocked, use PSI to quantify stalls, and only then reach for CPU profiling. That ordering prevents the common mistake of optimising application code when the real constraint was disk latency or a noisy neighbour.<\/p><h2 class=\"wp-block-heading\">Worked example: two servers, same load, different problems<\/h2><p class=\"wp-block-paragraph\">Server A runs 2 vCPUs at load 6 with <code>mpstat<\/code> showing 95% user time. Server B runs 4 vCPUs at load 6 with 40% user time and a large <code>wa<\/code>. Same load number, opposite diagnoses: A is CPU-bound and needs either fewer expensive requests or more cores; B is I\/O-bound and needs faster storage or better caching. Acting on the raw load figure alone would send you down the wrong path on at least one of them.<\/p><figure class=\"wp-block-table\"><table><thead><tr><th>Instance<\/th><th>load1\/nproc<\/th><th>us+sy<\/th><th>wa<\/th><th>Diagnosis<\/th><\/tr><\/thead><tbody><tr><td>A (2 vCPU)<\/td><td>3.0<\/td><td>95%<\/td><td>1%<\/td><td>CPU saturated \u2014 profile the hot path<\/td><\/tr><tr><td>B (4 vCPU)<\/td><td>1.5<\/td><td>40%<\/td><td>35%<\/td><td>I\/O bound \u2014 inspect disk and swap<\/td><\/tr><\/tbody><\/table><\/figure><p class=\"wp-block-paragraph\">Only after the split do you pick a remediation. Profile CPU with <code>perf<\/code> and flame graphs for A; check <code>iostat -x<\/code> for queue depth and utilisation, and swap activity, for B. The metric that tells you which is the ratio of runnable to blocked work, not the headline load.<\/p><h2 class=\"wp-block-heading\">A monitoring checklist that avoids the trap<\/h2><ul class=\"wp-block-list\"><li>Alert on <code>load1\/nproc<\/code> sustained above 1.0, never on raw load.<\/li><li>Always graph CPU-user, CPU-steal, iowait and PSI io side by side with load.<\/li><li>Record <code>nproc<\/code> per host so dashboards can normalise automatically.<\/li><li>Treat a rising load with flat CPU as an I\/O or steal investigation, not a CPU one.<\/li><\/ul><p class=\"wp-block-paragraph\">Load average is useful \u2014 it is a cheap early signal that a queue is forming. What it is not is a verdict on CPU. Read it next to core count, blocked-time and steal, and it becomes a reliable pointer to the right subsystem rather than a number that sends you optimising the wrong thing.<\/p>","protected":false},"excerpt":{"rendered":"<p>Why a load average of 8 can be harmless on an 8-core VPS and a load of 1.5 can be catastrophic on a 2-core one \u2014 and the metrics that tell you which situation you are in.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":6,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1151","post","type-post","status-publish","format-standard","hentry","category-performance-optimization"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled - Virtual Servers VPS Blog<\/title>\n<meta name=\"description\" content=\"Why a load average of 8 can be harmless on an 8-core VPS and a load of 1.5 can be catastrophic on a 2-core one \u2014 and the metrics that tell you which situation you are in.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled\" \/>\n<meta property=\"og:description\" content=\"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-17T02:01:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-13T22:04:09+00:00\" \/>\n<meta name=\"author\" content=\"Virtual-Servers-Vps-Editor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Virtual-Servers-Vps-Editor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/\",\"name\":\"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-09-17T02:01:11+00:00\",\"dateModified\":\"2026-10-13T22:04:09+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"description\":\"Why a load average of 8 can be harmless on an 8-core VPS and a load of 1.5 can be catastrophic on a 2-core one \u2014 and the metrics that tell you which situation you are in.\",\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/\",\"name\":\"Virtual Servers VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\",\"name\":\"Virtual-Servers-Vps-Editor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"caption\":\"Virtual-Servers-Vps-Editor\"},\"sameAs\":[\"https:\/\/virtualserversvps.com\/blog\"],\"url\":\"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled - Virtual Servers VPS Blog","description":"Why a load average of 8 can be harmless on an 8-core VPS and a load of 1.5 can be catastrophic on a 2-core one \u2014 and the metrics that tell you which situation you are in.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/","og_locale":"en_US","og_type":"article","og_title":"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled","og_description":"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled","og_url":"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-09-17T02:01:11+00:00","article_modified_time":"2026-10-13T22:04:09+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/","url":"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/","name":"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-09-17T02:01:11+00:00","dateModified":"2026-10-13T22:04:09+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"description":"Why a load average of 8 can be harmless on an 8-core VPS and a load of 1.5 can be catastrophic on a 2-core one \u2014 and the metrics that tell you which situation you are in.","breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/load-average-vs-cpu-saturation-vps-monitoring\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Load Average vs CPU Saturation on a VPS: Reading Both Without Getting Fooled"}]},{"@type":"WebSite","@id":"https:\/\/virtualserversvps.com\/blog\/#website","url":"https:\/\/virtualserversvps.com\/blog\/","name":"Virtual Servers VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0","name":"Virtual-Servers-Vps-Editor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","caption":"Virtual-Servers-Vps-Editor"},"sameAs":["https:\/\/virtualserversvps.com\/blog"],"url":"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/"}]}},"_links":{"self":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/comments?post=1151"}],"version-history":[{"count":4,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1151\/revisions"}],"predecessor-version":[{"id":1391,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1151\/revisions\/1391"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=1151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=1151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=1151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}