{"id":32272,"date":"2026-07-23T11:43:02","date_gmt":"2026-07-23T09:43:02","guid":{"rendered":"https:\/\/contabo.com\/blog\/?p=32272"},"modified":"2026-07-23T11:50:46","modified_gmt":"2026-07-23T09:50:46","slug":"benchmark-vds-cpu-performance","status":"publish","type":"post","link":"https:\/\/contabo.com\/blog\/benchmark-vds-cpu-performance\/","title":{"rendered":"How to Benchmark VDS CPU Performance vs a Shared VPS"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The two tests that actually prove dedicated CPU: monitor CPU steal time (%st in top or vmstat) over several hours, and run sysbench repeatedly rather than once. A one-shot benchmark score means nothing on its own \u2014 a <a href=\"https:\/\/contabo.com\/en\/vps\/\">shared VPS <\/a>can post the same number as a <a href=\"https:\/\/contabo.com\/en\/vps-dedicated\/\">VDS<\/a> for thirty seconds and then collapse the moment a neighboring tenant gets busy. Sustained monitoring is what separates a real dedicated-core claim from a marketing one.<\/p>\n\n\n\n<h2 id=\"h-why-a-single-benchmark-score-doesn-t-prove-dedicated-cpu\" class=\"wp-block-heading\">Why a Single Benchmark Score Doesn&#8217;t Prove Dedicated CPU<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run Geekbench or sysbench once on a shared <a href=\"https:\/\/contabo.com\/en\/vps\/\">VPS<\/a> during a quiet moment and you can get a score that looks identical to a genuinely dedicated core. The difference only shows up under sustained load and across different times of day \u2014 a burstable, oversubscribed CPU allocation looks fine in a 20-second snapshot and throttles or fluctuates once you push it for longer, or once other tenants on the same physical host start competing for cycles. That&#8217;s why the tests below are built around duration and repetition, not a single run.<\/p>\n\n\n\n<h2 id=\"h-step-1-check-cpu-steal-time-st\" class=\"wp-block-heading\">Step 1: Check CPU Steal Time (%st)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CPU steal time is the single clearest signal. It measures the percentage of time your virtual CPU wanted to run but the hypervisor gave that cycle to another tenant instead \u2014 the direct fingerprint of a shared host.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Quick check<br>top<br># Look for the %st value in the CPU line, e.g.:<br># %Cpu(s):&nbsp; ...&nbsp; 0.0 st<br><br># Per-core detail over a minute<br>mpstat -P ALL 1 60<br><br># Long sample \u2014 12 hours at 5-second intervals<br>sar -u 5 8640<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Interpretation: 0-1% is typical of a genuinely dedicated allocation. 1-5% in occasional spikes is usually fine \u2014 brief hypervisor scheduling noise happens even on dedicated cores. 5-10% sustained is measurable contention worth investigating. Anything above 10% sustained means your &#8220;dedicated&#8221; CPU isn&#8217;t behaving like one, regardless of what the plan is called.<\/p>\n\n\n\n<h2 id=\"h-step-2-run-a-sustained-sysbench-test-not-a-one-shot-benchmark\" class=\"wp-block-heading\">Step 2: Run a Sustained sysbench Test, Not a One-Shot Benchmark<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A single sysbench run tells you almost nothing. Run it repeatedly, across different hours \u2014 including peak times when other tenants on a shared host are most likely to be active \u2014 and look at the variance between runs, not just one number.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Install if needed<br>apt install sysbench<br><br># Single run<br>sysbench cpu --threads=$(nproc) --cpu-max-prime=20000 run<br><br># Repeated run \u2014 20 iterations, logging the time of each<br>for i in {1..20}; do<br>&nbsp; date<br>&nbsp; sysbench cpu --threads=$(nproc) --cpu-max-prime=20000 run<br>done<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Compare the total-time and events-per-second figures across all 20 runs. A <a href=\"https:\/\/contabo.com\/en\/vps-dedicated\/\">dedicated CPU allocation<\/a> should stay tight \u2014 results within a few percent of each other regardless of when you ran them. A shared VPS often shows real spread: one run at 20 seconds, the next at 21, then suddenly 35, then back to 25. Deviation beyond roughly 5-10% between runs is a strong signal you&#8217;re sharing physical cores with someone else&#8217;s workload.<\/p>\n\n\n\n<h2 id=\"h-step-3-run-a-long-endurance-test-with-stress-ng\" class=\"wp-block-heading\">Step 3: Run a Long Endurance Test with stress-ng<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Many <a href=\"https:\/\/contabo.com\/en\/vps\/\">shared VPS<\/a> plans allow short bursts of full performance before throttling kicks in \u2014 a CPU credit system that looks generous in a quick test and disappears under real, sustained load. An endurance test exposes this pattern directly.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>stress-ng --cpu $(nproc) --timeout 1h<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run this for a full hour while monitoring with htop or top in a second terminal. Watch for CPU frequency drops or a slowdown in task completion after the first 5-10 minutes \u2014 that&#8217;s the signature of a burst-then-throttle shared plan. A genuinely dedicated allocation should maintain flat, consistent performance for the entire hour.<\/p>\n\n\n\n<h2 id=\"h-reading-your-results-pass-or-fail\" class=\"wp-block-heading\">Reading Your Results: Pass or Fail<\/h2>\n\n\n\n<!-- VDS vs Shared VPS: CPU Benchmark Pass\/Fail Table -->\n<div class=\"vds-bench-table\" role=\"region\" aria-label=\"VDS CPU benchmark pass\/fail reference table\">\n  <style>\n    .vds-bench-table {\n      max-width: 100%;\n      margin: 1.5em 0;\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n      overflow-x: auto;\n    }\n    .vds-bench-table p.vbt-summary {\n      font-size: 1rem;\n      line-height: 1.55;\n      color: #333;\n      margin: 0 0 0.85em;\n    }\n    .vds-bench-table table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 0.95rem;\n      line-height: 1.45;\n      background: #fff;\n      box-shadow: 0 1px 3px rgba(0,0,0,0.08);\n    }\n    .vds-bench-table caption {\n      text-align: left;\n      font-weight: 600;\n      font-size: 0.85rem;\n      color: #5a6b7d;\n      padding: 0 0 0.6em;\n      caption-side: top;\n    }\n    .vds-bench-table thead th {\n      background: #365F91;\n      color: #fff;\n      font-weight: 600;\n      text-align: left;\n      padding: 0.75em 1em;\n      border: 1px solid #2e5280;\n    }\n    .vds-bench-table tbody th {\n      text-align: left;\n      font-weight: 600;\n      color: #1f2d3d;\n      background: #f4f6f9;\n      padding: 0.75em 1em;\n      border: 1px solid #dfe3e8;\n      white-space: nowrap;\n    }\n    .vds-bench-table tbody td {\n      padding: 0.75em 1em;\n      border: 1px solid #dfe3e8;\n      vertical-align: top;\n    }\n    .vds-bench-table td.vbt-pass {\n      background: #eef8f0;\n      color: #1c5e2e;\n    }\n    .vds-bench-table td.vbt-fail {\n      background: #fdeeee;\n      color: #7a1f1f;\n    }\n    \/* CSS unicode escapes (not literal emoji) \u2014 immune to entity re-encoding *\/\n    .vds-bench-table td.vbt-pass::before {\n      content: \"\\2713\\0020\";\n      font-weight: 700;\n    }\n    .vds-bench-table td.vbt-fail::before {\n      content: \"\\2717\\0020\";\n      font-weight: 700;\n    }\n    .vds-bench-table tbody tr:hover td,\n    .vds-bench-table tbody tr:hover th {\n      filter: brightness(0.97);\n    }\n    @media (max-width: 600px) {\n      .vds-bench-table table { font-size: 0.85rem; }\n      .vds-bench-table thead th,\n      .vds-bench-table tbody th,\n      .vds-bench-table tbody td { padding: 0.55em 0.6em; }\n    }\n  <\/style>\n\n  <p class=\"vbt-summary\">\n    <strong>Quick answer:<\/strong> a genuinely dedicated VDS CPU shows near-zero steal time, tight sysbench variance across repeated runs, and flat performance under a 1-hour stress-ng endurance test. A shared or oversubscribed VPS fails at least one of these three checks \u2014 use the table below to interpret your own results.\n  <\/p>\n\n  <table>\n    <caption>How to read VDS CPU benchmark results: dedicated-core pass criteria vs. shared\/oversubscribed fail signs<\/caption>\n    <thead>\n      <tr>\n        <th scope=\"col\">Metric<\/th>\n        <th scope=\"col\">Dedicated CPU (pass)<\/th>\n        <th scope=\"col\">Shared \/ Oversubscribed (fail)<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <th scope=\"row\">CPU steal time (%st)<\/th>\n        <td class=\"vbt-pass\">0\u20131% consistently, rare brief spikes<\/td>\n        <td class=\"vbt-fail\">Sustained 5\u201310%+, spikes above 10% under load<\/td>\n      <\/tr>\n      <tr>\n        <th scope=\"row\">sysbench run-to-run variance<\/th>\n        <td class=\"vbt-pass\">Within a few percent across 20 runs, any time of day<\/td>\n        <td class=\"vbt-fail\">Swings of 10%+ between runs, worse at peak hours<\/td>\n      <\/tr>\n      <tr>\n        <th scope=\"row\">stress-ng 1-hour endurance<\/th>\n        <td class=\"vbt-pass\">Flat performance for the full hour<\/td>\n        <td class=\"vbt-fail\">Throttling or frequency drop after 5\u201310 minutes<\/td>\n      <\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Verify Contabo&#8217;s Dedicated Cores With This Exact Method<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/contabo.com\/en\/vps-dedicated\/\">Contabo&#8217;s Cloud VDS line<\/a> &#8211; Max Performance VPS &#8211; ships with dedicated AMD EPYC cores as the default configuration, not an add-on \u2014 but you don&#8217;t have to take that on faith. Run the exact three tests above against a <a href=\"https:\/\/contabo.com\/en\/vps-dedicated\/\">Cloud VDS<\/a> instance yourself: check steal time over several hours, loop sysbench across peak and off-peak periods, and run the stress-ng endurance test for a full hour. A genuinely <a href=\"https:\/\/contabo.com\/en\/vps-dedicated\/\">dedicated core <\/a>should pass all three cleanly. Cloud VDS pairs that with NVMe storage by default, RAM-per-Euro value on the <a href=\"https:\/\/contabo.com\/en\/vps\/\">Core VPS line<\/a> if you&#8217;re not ready for dedicated cores yet, and contract terms from <a href=\"https:\/\/contabo.com\/en\/pricing\/\">month-to-month up to 24 months<\/a> \u2014 so testing before committing to a longer term costs you nothing but the hour it takes to run stress-ng.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ: Benchmarking VDS vs Shared VPS<\/h2>\n\n\n\n<div class=\"schema-faq wp-block-yoast-faq-block\"><div class=\"schema-faq-section\" id=\"faq-question-1784799413485\"><strong class=\"schema-faq-question\">What is a good CPU steal time for a VDS?<\/strong> <p class=\"schema-faq-answer\">0-1% consistently is what a genuinely dedicated allocation should show, with only occasional brief spikes into the low single digits. Sustained steal time above 5% is worth investigating; above 10% sustained means the CPU isn&#8217;t behaving like a dedicated core regardless of the plan name.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1784799425559\"><strong class=\"schema-faq-question\">Can sysbench alone prove a VPS is not shared?<\/strong> <p class=\"schema-faq-answer\">Not on its own. A single sysbench run can look identical on shared and dedicated hardware \u2014 the proof is in running it repeatedly across different times of day and comparing the variance. Pair it with CPU steal time monitoring for a complete picture; neither test alone is conclusive.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1784799436376\"><strong class=\"schema-faq-question\">How long should I run a CPU benchmark to detect a shared host?<\/strong> <p class=\"schema-faq-answer\">Longer than you&#8217;d think. A short burst test can pass on a burstable shared plan that throttles only after several minutes. Run sysbench in a repeated loop across at least a few hours spanning peak and off-peak times, and run a stress-ng endurance test for at least a full hour to catch throttling that a quick test would miss entirely.<\/p> <\/div> <\/div>\n","protected":false},"excerpt":{"rendered":"<p>The two tests that actually prove dedicated CPU: monitor CPU steal time (%st in top or vmstat) over several hours, and run sysbench repeatedly rather than once. A one-shot benchmark score means nothing on its own \u2014 a shared VPS can post the same number as a VDS for thirty seconds and then collapse the [&hellip;]<\/p>\n","protected":false},"author":78,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[18],"tags":[],"ppma_author":[4285],"class_list":["post-32272","post","type-post","status-publish","format-standard","hentry","category-tutorials"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Jie Guo","author_link":"https:\/\/contabo.com\/blog\/author\/jieguo\/"},"uagb_comment_info":0,"uagb_excerpt":"The two tests that actually prove dedicated CPU: monitor CPU steal time (%st in top or vmstat) over several hours, and run sysbench repeatedly rather than once. A one-shot benchmark score means nothing on its own \u2014 a shared VPS can post the same number as a VDS for thirty seconds and then collapse the&hellip;","authors":[{"term_id":4285,"user_id":78,"is_guest":0,"slug":"jieguo","display_name":"Jie Guo","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/4e0d981b06988d6d456834e9d55bc9e713e918fa8444325543d14f448154106b?s=96&d=mm&r=g","author_category":"","user_url":"","last_name":"Guo","first_name":"Jie","job_title":"","description":""}],"_links":{"self":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts\/32272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/comments?post=32272"}],"version-history":[{"count":4,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts\/32272\/revisions"}],"predecessor-version":[{"id":32276,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts\/32272\/revisions\/32276"}],"wp:attachment":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/media?parent=32272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/categories?post=32272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/tags?post=32272"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=32272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}