{"id":1657,"date":"2026-11-09T22:37:03","date_gmt":"2026-11-09T22:37:03","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=1657"},"modified":"2026-11-09T22:37:03","modified_gmt":"2026-11-09T22:37:03","slug":"kernel-hz-tickless-idle-vps-overhead","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/","title":{"rendered":"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts"},"content":{"rendered":"<div style=\"padding:20px\">\n<p>Two VPS hosts can sell identical vCPU counts and differ by several percent on a latency-sensitive workload before you write a line of application code, because of how often the guest kernel wakes a sleeping core. The timer tick, the CONFIG_HZ value baked into the kernel, and whether the build uses NO_HZ_IDLE or NO_HZ_FULL decide how much work an idle vCPU does and how precisely it can sleep. On a hypervisor, those micro-wakeups also translate into VM exits that steal real cycles from the host.<\/p>\n<h2>What the tick actually is<\/h2>\n<p>A classic kernel programs a local APIC timer to fire CONFIG_HZ times per second. Each interrupt runs scheduler accounting, RCU callbacks, and timekeeping, then returns to idle. At CONFIG_HZ=250 that is 250 interrupts per second per core even with nothing to do; at 1000 it is a thousand. On a 16-vCPU guest that is 16,000 wakeups per second of pure overhead.<\/p>\n<p>Idle cores in a VM are worse than idle cores on bare metal because each tick can trigger a VM exit and a return, which costs on the order of microseconds. Read the counter directly: <code>grep -E 'LOC|RES|CAL' \/proc\/interrupts<\/code> before and after a 30 second idle window gives a wakeups-per-second figure you can compare between hosts.<\/p>\n<h2>NO_HZ_IDLE versus NO_HZ_FULL<\/h2>\n<p>NO_HZ_IDLE stops the periodic tick when a CPU has nothing to run, keeping time through the clocksource on wake. Every general-purpose distribution kernel uses it; it removes most idle overhead automatically. NO_HZ_FULL goes further and removes the tick even while a single task runs, at the cost of per-CPU <code>nohz_full=<\/code> configuration and reduced accounting precision.<\/p>\n<p>NO_HZ_FULL is for dedicated real-time or DPDK-style pinning, not for shared web hosting. What matters for a VPS is whether the provider&#8217;s kernel exposes a sane clocksource and whether <code>\/sys\/devices\/system\/clocksource\/clocksource0\/available_clocksource<\/code> includes a stable option such as <code>kvm-clock<\/code> or <code>tsc<\/code>. A guest falling back to <code>hpet<\/code> or <code>acpi_pm<\/code> pays far more per timer read than the tick overhead you are trying to remove.<\/p>\n<h2>Measuring idle overhead per host<\/h2>\n<p>Boot a clean instance with no services beyond sshd, wait two minutes for boot-time work to settle, then sample for 60 seconds: <code>sar -u 1 60<\/code>, <code>vmstat 1 60<\/code> and the interrupt counters. Record <code>%system<\/code>, <code>%idle<\/code>, interrupts per second and context switches per second. A guest with proper tickless behaviour shows nearly zero system time and only a handful of interrupts per second.<\/p>\n<p>Two samples are not enough \u2014 collect the same window three times and compare medians. Run the check on a second instance of the same plan to see host-to-host variance, and repeat after 24 hours of uptime, because some providers inject guest agents and monitoring probes that wake cores far more often than a tick ever would.<\/p>\n<h2>Thresholds worth acting on<\/h2>\n<p>On a quiet 1-vCPU instance, expect under 200 interrupts per second, under 100 context switches per second, and <code>%system<\/code> under 0.5. Sustained figures several times higher suggest a guest agent polling in a loop, a monitoring daemon with a tight interval, or a host that has disabled tickless idle in its kernel configuration.<\/p>\n<p>For a latency workload, run a small task pinned to an idle core with <code>taskset -c 3 cyclictest -p 50 -i 1000 -n -l 10000<\/code>. Wakeup latency p99 above 100 \u00b5s on an otherwise idle VPS points to tick or VM-exit interference; on bare metal the same test typically stays under 30 \u00b5s. That gap is the tax you are paying for virtualisation.<\/p>\n<h2>Building the kernel argument for comparison<\/h2>\n<p>You cannot change the host&#8217;s CONFIG_HZ, but you can compare guests fairly by noting <code>zcat \/proc\/config.gz | grep -E 'CONFIG_HZ|CONFIG_NO_HZ|CONFIG_HIGH_RES_TIMERS'<\/code> where the provider ships <code>\/proc\/config.gz<\/code>. Many do not, in which case use <code>uname -a<\/code> plus the distribution default and state your assumption clearly in the report.<\/p>\n<p>Always verify high-resolution timers are active: <code>cat \/sys\/devices\/system\/clocksource\/clocksource0\/current_clocksource<\/code> and <code>grep hres_active \/proc\/timer_list<\/code>. Without hrtimers, tickless idle is effectively off and your measurements describe the distributor&#8217;s build, not the provider&#8217;s hardware. Correct for that before drawing conclusions about hosts.<\/p>\n<h2>Isolating tick cost from neighbour noise<\/h2>\n<p>Idle overhead and CPU steal look similar in coarse tools. Separate them with <code>mpstat -P ALL 1 30<\/code>: uniform system time across cores with no steal is tick overhead, while spikes concentrated on some cores with a rising <code>%steal<\/code> is the hypervisor. Interrupt counters help too \u2014 tick interrupts arrive at a fixed cadence, host interference does not.<\/p>\n<p>For a decisive test, compare <code>perf stat -e cycles,instructions,context-switches -a sleep 30<\/code> on an idle instance against a busy one. Cycles per second on the idle guest give you a direct overhead figure in hardware terms, which is the number that matters when you are paying for a vCPU that is supposed to be sleeping.<\/p>\n<h2>What to do with the finding<\/h2>\n<p>If a provider&#8217;s idle overhead is high, you have three options: accept it, pin latency-critical work to a core and reduce the impact of wakeups with <code>isolcpus<\/code>, or move. For most workloads the practical fix is to remove guest-side pollers, set monitoring intervals above 30 seconds, and use event-driven tooling instead of per-second sampling scripts that themselves generate thousands of wakeups.<\/p>\n<p>Record the idle overhead next to the price in your provider spreadsheet, because a host that costs ten percent less but burns a percent of every core on tick overhead and another on steal is not cheaper. Our <a href=\"https:\/\/virtualserversvps.com\/\">VPS comparison table<\/a> notes kernel and clock-source details per tier, and <a href=\"https:\/\/virtualserversvps.com\/\">the plan breakdown<\/a> explains which configurations are worth benchmarking for low-latency work. Rerun the same measurements after any provider migration.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Two VPS hosts can sell identical vCPU counts and differ by several percent on a latency-sensitive workload before you write a line of application code, because of how often the&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1657","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>Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts - Virtual Servers VPS Blog<\/title>\n<meta name=\"description\" content=\"Two VPS hosts can sell identical vCPU counts and differ by several percent on a latency-sensitive workload before you write a line of application code,\" \/>\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\/kernel-hz-tickless-idle-vps-overhead\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts\" \/>\n<meta property=\"og:description\" content=\"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-09T22:37:03+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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/\",\"name\":\"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-11-09T22:37:03+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"description\":\"Two VPS hosts can sell identical vCPU counts and differ by several percent on a latency-sensitive workload before you write a line of application code,\",\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts\"}]},{\"@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":"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts - Virtual Servers VPS Blog","description":"Two VPS hosts can sell identical vCPU counts and differ by several percent on a latency-sensitive workload before you write a line of application code,","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\/kernel-hz-tickless-idle-vps-overhead\/","og_locale":"en_US","og_type":"article","og_title":"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts","og_description":"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts","og_url":"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-11-09T22:37:03+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/","url":"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/","name":"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-11-09T22:37:03+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"description":"Two VPS hosts can sell identical vCPU counts and differ by several percent on a latency-sensitive workload before you write a line of application code,","breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/kernel-hz-tickless-idle-vps-overhead\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kernel HZ, NO_HZ and Tickless Idle: Why Idle vCPU Overhead Differs Between VPS Hosts"}]},{"@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\/1657","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=1657"}],"version-history":[{"count":1,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1657\/revisions"}],"predecessor-version":[{"id":1658,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1657\/revisions\/1658"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=1657"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=1657"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=1657"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}