{"id":701,"date":"2026-02-26T10:22:58","date_gmt":"2026-02-26T10:22:58","guid":{"rendered":"https:\/\/hosting.international\/blog\/?p=701"},"modified":"2026-04-14T17:12:47","modified_gmt":"2026-04-14T17:12:47","slug":"reproducible-laboratory-comparative-study-of-vps-vs-dedicated","status":"publish","type":"post","link":"https:\/\/hosting.international\/blog\/reproducible-laboratory-comparative-study-of-vps-vs-dedicated\/","title":{"rendered":"Reproducible Laboratory Comparative Study of VPS vs Dedicated"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"executive-summary\">Executive summary<\/h2>\n\n\n\n<p>VPS and Dedicated differ less in \u201caverage speed\u201d than in&nbsp;<em>latency predictability<\/em>&nbsp;(p95\/p99) and resilience to multi-tenant interference (\u201cnoisy neighbor\u201d), which tends to be most visible in storage I\/O and networking.&nbsp;<br>A key diagnostic indicator of CPU contention on VPS is&nbsp;<strong>CPU steal time<\/strong>&nbsp;(visible in&nbsp;<code>\/proc\/stat<\/code>,&nbsp;<code>top<\/code>,&nbsp;<code>vmstat<\/code>), reflecting CPU time taken by the hypervisor in favor of other guests.&nbsp;<br>This article proposes a reproducible benchmark protocol (fio\/sysbench\/iperf3\/pgbench) with&nbsp;<strong>\u226510 repeated 60-second runs<\/strong>&nbsp;plus&nbsp;<strong>long runs (1\u20136 hours, recommended 4h)<\/strong>&nbsp;with telemetry (iostat\/vmstat\/sar\/pidstat).&nbsp;<br>The Results section provides a&nbsp;<strong>demonstration dataset and charts<\/strong>&nbsp;that are&nbsp;<strong>explicitly marked as simulated<\/strong>, constructed to reflect published patterns of variability in shared environments (tail events, interference, and diagnostic value of&nbsp;<code>%steal<\/code>).&nbsp;<br>We show how to compare p95\/p99 statistically via&nbsp;<strong>bootstrap confidence intervals for differences of medians<\/strong>&nbsp;and the&nbsp;<strong>Mann\u2013Whitney U test<\/strong>, and how to report effect sizes (Cliff\u2019s delta \/ probabilistic dominance).&nbsp;<br>Practical implication: for IO-bound systems (databases, logs, persistent queues), disk tail latency predominates; for CPU-bound workloads,&nbsp;<code>%steal<\/code>&nbsp;is critical; for network-bound services, jitter\/p99 RTT plus port throughput are decisive.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"introduction\">Introduction<\/h2>\n\n\n\n<p>In infrastructure hosting, comparing VPS and Dedicated is more rigorous when framed as a comparison of&nbsp;<strong>resource-sharing models<\/strong>&nbsp;and their&nbsp;<strong>resulting latency distributions<\/strong>, rather than a direct comparison of \u201ccores and gigabytes.\u201d&nbsp;<br>In large and distributed services, rare latency spikes and&nbsp;<strong>tail latency<\/strong>&nbsp;events can disproportionately affect user experience; eliminating variability sources completely\u2014especially in shared environments\u2014is usually impractical.&nbsp;<br>Multi-tenancy can cause performance interference: a \u201cnoisy neighbor\u201d may degrade other tenants\u2019 metrics, and shared storage\/network subsystems can show noticeable variability even when average throughput looks acceptable.&nbsp;<br>Therefore, reproducible comparisons should publish not only throughput\/IOPS but also&nbsp;<strong>p50\/p95\/p99 latency<\/strong>, plus system contention signals such as&nbsp;<strong>%steal<\/strong>&nbsp;and&nbsp;<strong>%iowait<\/strong>, and&nbsp;<strong>time dynamics<\/strong>&nbsp;in long runs.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"problem-hypotheses-and-assumptions\">Problem, hypotheses, and assumptions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"problem-statement\">Problem statement<\/h3>\n\n\n\n<p>Goal: define a reproducible protocol that allows a hosting provider (or customer) to compare VPS and Dedicated service classes under representative configurations and workloads, then interpret results in terms of tail latency, variability, and root causes (CPU scheduling, I\/O contention, network behavior).&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"research-questions\">Research questions<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RQ1: Do VPS and Dedicated differ in p95\/p99 disk latency for database\/log-relevant profiles (fsync-write)?\u00a0<\/li>\n\n\n\n<li>RQ2: How different is network variability (RTT\/jitter) and throughput (iperf3) between VPS and Dedicated?\u00a0<\/li>\n\n\n\n<li>RQ3: Do %steal and %iowait explain observed tail-latency spikes and degradations?\u00a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"operational-hypotheses\">Operational hypotheses<\/h3>\n\n\n\n<p>H1: Dedicated shows a lower median p99 latency for synchronous writes (fsync) and lower temporal spread of p99 than shared VPS.&nbsp;<br>H2: VPS exhibits non-zero %steal correlated with increased p99 latency (host-level CPU contention as a tail-latency factor).&nbsp;<br>H3: A premium VPS with guaranteed resources approaches Dedicated in tail latency and %steal but may still lag under shared storage\/network contention.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"representative-benchmark-configurations\">Representative benchmark configurations<\/h3>\n\n\n\n<p>When providers\/tariffs are unspecified, we evaluate these representative classes (treated as&nbsp;<em>classes of setups<\/em>, not vendor products):&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>small VPS<\/strong>: 1 vCPU, 2 GB RAM, SSD (shared CPU)<\/li>\n\n\n\n<li><strong>medium VPS<\/strong>: 2 vCPU, 4 GB RAM, NVMe (shared CPU)<\/li>\n\n\n\n<li><strong>premium VPS<\/strong>: 4 vCPU, 8 GB RAM, NVMe + \u201cguaranteed resources\u201d (assumption: reduced oversubscription\/CPU pinning and disk QoS)<\/li>\n\n\n\n<li><strong>dedicated small<\/strong>: 4 cores, 16 GB RAM, 1\u00d7NVMe, 1G<\/li>\n\n\n\n<li><strong>dedicated large<\/strong>: 8 cores, 32 GB RAM, 2\u00d7NVMe, 10G\u00a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"explicit-assumptions-fixed-for-reproducibility\">Explicit assumptions (fixed for reproducibility)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OS\/kernel:\u00a0<strong>Ubuntu Server 24.04 LTS<\/strong>,\u00a0<strong>Linux kernel 6.8.x<\/strong>.\u00a0<\/li>\n\n\n\n<li>CPU governor:\u00a0<code>performance<\/code>\u00a0(reduce DVFS-related variance during tests).\u00a0<\/li>\n\n\n\n<li>I\/O scheduler:\n<ul class=\"wp-block-list\">\n<li><strong>NVMe<\/strong>:\u00a0<code>none<\/code><\/li>\n\n\n\n<li><strong>SATA\/SAS SSD<\/strong>\u00a0(small VPS \u201cSSD\u201d class):\u00a0<code>mq-deadline<\/code>\u00a0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Filesystem\/mount:\u00a0<code>ext4<\/code>\u00a0with\u00a0<code>noatime,nodiratime<\/code>.\u00a0<\/li>\n\n\n\n<li>VPS oversubscription is unknown and not measured directly;\u00a0<strong>%steal<\/strong>\u00a0is used as a proxy for host-level CPU contention.\u00a0<\/li>\n\n\n\n<li>VPS storage model assumed as a shared pool; hence heavier latency tails are expected than on single-tenant local NVMe.\u00a0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"materials-and-methods\">Materials and methods<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"what-exactly-is-compared\">What exactly is compared<\/h3>\n\n\n\n<p>This study interprets \u201cVPS vs Dedicated\u201d as a comparison of two deployment architectures:&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>VPS as a guest OS under a hypervisor (typical stack: KVM + paravirtualized virtio devices).<\/li>\n\n\n\n<li>Dedicated as an OS running directly on physical hardware.\u00a0<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tools-and-outputs\">Tools and outputs<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>fio<\/strong>: IOPS\/BW and completion latency percentiles (clat), exported in JSON for aggregation.\u00a0<\/li>\n\n\n\n<li><strong>sysbench<\/strong>: modular benchmark for CPU and memory.\u00a0<\/li>\n\n\n\n<li><strong>iperf3<\/strong>: throughput (JSON output with\u00a0<code>-J<\/code>).\u00a0<\/li>\n\n\n\n<li><strong>pgbench<\/strong>: database-class benchmark (TPS and transaction latency statistics).\u00a0<\/li>\n\n\n\n<li><strong>sysstat<\/strong>\u00a0stack (sar\/iostat\/pidstat): telemetry and per-process attribution.\u00a0<\/li>\n<\/ul>\n\n\n\n<p>Mandatory contention metrics:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>%steal<\/strong>\u00a0(CPU time desired by the guest but not granted due to host scheduling).\u00a0<\/li>\n\n\n\n<li><strong>%iowait<\/strong>\u00a0(CPU idle while waiting for I\/O completion).\u00a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"benchmark-profiles-and-exact-parameters\">Benchmark profiles and exact parameters<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"fio-profiles-storage\">fio profiles (storage)<\/h4>\n\n\n\n<p>We use these fixed fio profiles (block size, queue depth, and sync semantics are explicit):&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>randread<\/code>: 4k,\u00a0<code>iodepth=32<\/code><\/li>\n\n\n\n<li><code>randwrite<\/code>: 4k,\u00a0<code>iodepth=32<\/code><\/li>\n\n\n\n<li><code>randwrite + fsync<\/code>: 4k,\u00a0<code>iodepth=1<\/code>,\u00a0<code>direct=1<\/code>,\u00a0<code>fsync=1<\/code>\u00a0<\/li>\n<\/ul>\n\n\n\n<p>Percentiles are reported as p50\/p95\/p99 of completion latency (clat).&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"sysbench-profiles-cpumemory\">sysbench profiles (CPU\/memory)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>sysbench cpu<\/code><\/li>\n\n\n\n<li><code>sysbench memory<\/code>\u00a0<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"network-profiles\">Network profiles<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>iperf3 -t 60 -J<\/code><\/li>\n\n\n\n<li><code>ping -i 0.2 -c 300<\/code>\u00a0and compute p50\/p95\/p99 RTT from raw output.\u00a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"experimental-design-and-telemetry\">Experimental design and telemetry<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Short runs:\u00a0<strong>60 seconds<\/strong>,\u00a0<strong>\u226510 repeats<\/strong>\u00a0per test and configuration.\u00a0<\/li>\n\n\n\n<li>Long runs:\u00a0<strong>1\u20136 hours<\/strong>, recommended\u00a0<strong>4 hours<\/strong>, tracking time series of p99 and system metrics.\u00a0<\/li>\n\n\n\n<li>Optional warm-up exclusion: first 5\u201310 seconds may be excluded (especially for TCP slow-start in iperf3).\u00a0<\/li>\n\n\n\n<li>Telemetry capture cadence (example): 1-second iostat\/vmstat\/sar sampling into log files.\u00a0<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>flowchart LR\n  A[Provision VPS\/Dedicated host] --> B[Fix OS\/kernel and CPUFreq\/I-O scheduler settings]\n  B --> C[Install tools: fio, sysbench, iperf3, pgbench, sysstat]\n  C --> D[Short runs: 60s \u00d7 10 repeats (disk\/network\/CPU)]\n  C --> E[Long run: 1\u20136 hours (recommended 4h) with p99 time series]\n  D --> F[Collect telemetry: iostat\/vmstat\/sar\/pidstat and %steal]\n  E --> F\n  F --> G[Parse JSON\/logs into unified CSV]\n  G --> H[Compute p50\/p95\/p99 + statistical analysis]\n  H --> I[Publish tables + CDFs + time-series figures]<\/code>\n\n<img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"230\" class=\"wp-image-702\" style=\"width: 2000px;\" src=\"https:\/\/hosting.international\/blog\/wp-content\/uploads\/2026\/02\/test-res-scaled.png\" alt=\"\" srcset=\"https:\/\/hosting.international\/blog\/wp-content\/uploads\/2026\/02\/test-res-scaled.png 2560w, https:\/\/hosting.international\/blog\/wp-content\/uploads\/2026\/02\/test-res-300x35.png 300w, https:\/\/hosting.international\/blog\/wp-content\/uploads\/2026\/02\/test-res-1024x118.png 1024w, https:\/\/hosting.international\/blog\/wp-content\/uploads\/2026\/02\/test-res-768x88.png 768w, https:\/\/hosting.international\/blog\/wp-content\/uploads\/2026\/02\/test-res-1536x177.png 1536w, https:\/\/hosting.international\/blog\/wp-content\/uploads\/2026\/02\/test-res-2048x236.png 2048w\" sizes=\"auto, (max-width: 2000px) 100vw, 2000px\" \/>\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"results\">Results<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"important-note-on-data-provenance\">Important note on data provenance<\/h3>\n\n\n\n<p><strong>Live measurements are not possible in this environment<\/strong>, so the results below are&nbsp;<strong>simulated<\/strong>&nbsp;as a&nbsp;<em>publication-ready example<\/em>&nbsp;of how to report and analyze VPS vs Dedicated. The simulation is constructed to reflect published qualitative patterns: heavier tails and \u201crare spikes\u201d in shared environments, storage\/network interference, and the diagnostic role of %steal.&nbsp;<\/p>\n\n\n\n<p><strong>Simulation model (explicit).<\/strong>&nbsp;To generate plausible tails and spikes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Per-run latencies are drawn from a heavy-tailed distribution (e.g., lognormal or mixture-of-lognormals) calibrated to target percentiles.<\/li>\n\n\n\n<li>Long-run p99 time series are produced by a baseline process plus rare spikes (e.g., a Poisson shock process) to emulate intermittent contention, with spike probability\/scale higher for shared VPS classes than for Dedicated.<\/li>\n\n\n\n<li>%steal is generated as a correlated variable that increases in spike windows to reflect host-level contention coupling.\u00a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"disk-results-fio--simulated-medians-across-10-runs\">Disk results (fio) \u2014 simulated, medians across 10 runs<\/h3>\n\n\n\n<p>Table 1. fio profiles (simulated; medians across 10 runs).&nbsp;<code>lat p50\/p95\/p99<\/code>&nbsp;are completion latency (clat) percentiles.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Workload (fio)<\/th><th class=\"has-text-align-left\" data-align=\"left\">Configuration<\/th><th class=\"has-text-align-right\" data-align=\"right\">IOPS (median)<\/th><th class=\"has-text-align-right\" data-align=\"right\">BW (MiB\/s, median)<\/th><th class=\"has-text-align-right\" data-align=\"right\">lat p50 (ms)<\/th><th class=\"has-text-align-right\" data-align=\"right\">lat p95 (ms)<\/th><th class=\"has-text-align-right\" data-align=\"right\">lat p99 (ms)<\/th><th class=\"has-text-align-right\" data-align=\"right\">CPU steal (%, median)<\/th><th class=\"has-text-align-right\" data-align=\"right\">CPU iowait (%, median)<\/th><\/tr><\/thead><tbody><tr><td>randread 4k, iodepth=32<\/td><td>vps_small<\/td><td class=\"has-text-align-right\" data-align=\"right\">17,800<\/td><td class=\"has-text-align-right\" data-align=\"right\">69.5<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.352<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.630<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.821<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.884<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randread 4k, iodepth=32<\/td><td>vps_medium<\/td><td class=\"has-text-align-right\" data-align=\"right\">64,234<\/td><td class=\"has-text-align-right\" data-align=\"right\">250.9<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.203<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.963<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.217<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.876<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randread 4k, iodepth=32<\/td><td>vps_premium<\/td><td class=\"has-text-align-right\" data-align=\"right\">90,128<\/td><td class=\"has-text-align-right\" data-align=\"right\">352.1<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.151<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.631<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.311<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.623<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randread 4k, iodepth=32<\/td><td>ded_small<\/td><td class=\"has-text-align-right\" data-align=\"right\">156,443<\/td><td class=\"has-text-align-right\" data-align=\"right\">611.1<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.121<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.465<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.879<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.043<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randread 4k, iodepth=32<\/td><td>ded_large<\/td><td class=\"has-text-align-right\" data-align=\"right\">261,811<\/td><td class=\"has-text-align-right\" data-align=\"right\">1022.7<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.100<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.412<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.781<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.024<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randwrite 4k, iodepth=32<\/td><td>vps_small<\/td><td class=\"has-text-align-right\" data-align=\"right\">12,606<\/td><td class=\"has-text-align-right\" data-align=\"right\">49.2<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.457<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.233<\/td><td class=\"has-text-align-right\" data-align=\"right\">5.703<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.463<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randwrite 4k, iodepth=32<\/td><td>vps_medium<\/td><td class=\"has-text-align-right\" data-align=\"right\">45,396<\/td><td class=\"has-text-align-right\" data-align=\"right\">177.3<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.283<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.318<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.091<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.837<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randwrite 4k, iodepth=32<\/td><td>vps_premium<\/td><td class=\"has-text-align-right\" data-align=\"right\">71,426<\/td><td class=\"has-text-align-right\" data-align=\"right\">279.0<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.202<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.850<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.763<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.648<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randwrite 4k, iodepth=32<\/td><td>ded_small<\/td><td class=\"has-text-align-right\" data-align=\"right\">120,956<\/td><td class=\"has-text-align-right\" data-align=\"right\">472.5<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.161<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.622<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.188<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.048<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randwrite 4k, iodepth=32<\/td><td>ded_large<\/td><td class=\"has-text-align-right\" data-align=\"right\">201,886<\/td><td class=\"has-text-align-right\" data-align=\"right\">788.6<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.141<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.569<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.087<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.033<\/td><td class=\"has-text-align-right\" data-align=\"right\">\u2014<\/td><\/tr><tr><td>randwrite 4k + fsync, iodepth=1<\/td><td>vps_small<\/td><td class=\"has-text-align-right\" data-align=\"right\">556<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.2<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.048<\/td><td class=\"has-text-align-right\" data-align=\"right\">18.373<\/td><td class=\"has-text-align-right\" data-align=\"right\">60.267<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.673<\/td><td class=\"has-text-align-right\" data-align=\"right\">11.339<\/td><\/tr><tr><td>randwrite 4k + fsync, iodepth=1<\/td><td>vps_medium<\/td><td class=\"has-text-align-right\" data-align=\"right\">880<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.4<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.021<\/td><td class=\"has-text-align-right\" data-align=\"right\">9.378<\/td><td class=\"has-text-align-right\" data-align=\"right\">34.889<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.746<\/td><td class=\"has-text-align-right\" data-align=\"right\">7.361<\/td><\/tr><tr><td>randwrite 4k + fsync, iodepth=1<\/td><td>vps_premium<\/td><td class=\"has-text-align-right\" data-align=\"right\">1,438<\/td><td class=\"has-text-align-right\" data-align=\"right\">5.6<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.606<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.255<\/td><td class=\"has-text-align-right\" data-align=\"right\">9.046<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.705<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.135<\/td><\/tr><tr><td>randwrite 4k + fsync, iodepth=1<\/td><td>ded_small<\/td><td class=\"has-text-align-right\" data-align=\"right\">2,225<\/td><td class=\"has-text-align-right\" data-align=\"right\">8.7<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.402<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.538<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.865<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.053<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.552<\/td><\/tr><tr><td>randwrite 4k + fsync, iodepth=1<\/td><td>ded_large<\/td><td class=\"has-text-align-right\" data-align=\"right\">2,605<\/td><td class=\"has-text-align-right\" data-align=\"right\">10.2<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.351<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.224<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.145<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.025<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.047<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Interpretation: the&nbsp;<strong>fsync profile<\/strong>&nbsp;(bottom five rows) is the most revealing for shared environments, because synchronous writes expose tail latency due to queueing, background activity, and shared contention\u2014consistent with the \u201crare spikes\u201d thesis for service quality.&nbsp;<\/p>\n\n\n\n<p>Figure 1 (simulated): CDF of disk latency (fsync write).<\/p>\n\n\n\n<p>Figure 2 (simulated): 4-hour time series of p99 fsync-write latency.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"network-results--simulated-medians-across-10-runs\">Network results \u2014 simulated, medians across 10 runs<\/h3>\n\n\n\n<p>Table 2. RTT and iperf3 metrics (simulated; medians across 10 runs). Ping percentiles p50\/p95\/p99 are used to capture jitter and tail RTT, and iperf3 JSON output supports programmatic aggregation.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Metric<\/th><th class=\"has-text-align-right\" data-align=\"right\">vps_small<\/th><th class=\"has-text-align-right\" data-align=\"right\">vps_medium<\/th><th class=\"has-text-align-right\" data-align=\"right\">vps_premium<\/th><th class=\"has-text-align-right\" data-align=\"right\">ded_small<\/th><th class=\"has-text-align-right\" data-align=\"right\">ded_large<\/th><\/tr><\/thead><tbody><tr><td>ping RTT p50 (ms)<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.904<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.804<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.703<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.601<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.551<\/td><\/tr><tr><td>ping RTT p95 (ms)<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.651<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.084<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.543<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.222<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.010<\/td><\/tr><tr><td>ping RTT p99 (ms)<\/td><td class=\"has-text-align-right\" data-align=\"right\">5.043<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.516<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.323<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.718<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.339<\/td><\/tr><tr><td>iperf3 TCP throughput (Gbps, median)<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.860<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.962<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.264<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.903<\/td><td class=\"has-text-align-right\" data-align=\"right\">9.113<\/td><\/tr><tr><td>iperf3 TCP retransmits (median, per 60s)<\/td><td class=\"has-text-align-right\" data-align=\"right\">161<\/td><td class=\"has-text-align-right\" data-align=\"right\">119<\/td><td class=\"has-text-align-right\" data-align=\"right\">76<\/td><td class=\"has-text-align-right\" data-align=\"right\">60<\/td><td class=\"has-text-align-right\" data-align=\"right\">27<\/td><\/tr><tr><td>CPU steal during network test (%, median)<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.227<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.139<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.662<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.052<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.036<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Practical interpretation: in multi-tenant infrastructure, it is insufficient to report bandwidth alone; p95\/p99 RTT and jitter (tail behavior) matter because they affect \u201cchattiness\u201d of distributed services (many short RPCs\/requests).&nbsp;<\/p>\n\n\n\n<p>Figure 3 (simulated): CDF of ping RTT.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"statistical-analysis\">Statistical analysis<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"metrics-and-formulas\">Metrics and formulas<\/h3>\n\n\n\n<p><strong>Latency percentiles.<\/strong>&nbsp;For an observed latency sample ( {x_1,\\dots,x_n} ), the (p)-th percentile (Q_p) is the value such that approximately (p%) of observations are (\\le Q_p). In practice, percentiles are computed by a defined quantile estimator (report which implementation is used).&nbsp;<\/p>\n\n\n\n<p><strong>IOPS and bandwidth relationship.<\/strong>&nbsp;For fixed block size (b) (bytes), the relationship is:<br>[ \\text{BW} \\approx \\text{IOPS} \\times b ] or equivalently<br>[ \\text{IOPS} \\approx \\frac{\\text{BW}}{b} ] When BW is reported in MiB\/s and (b) in bytes, unit conversion is required.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"hypothesis-testing-methodology-bootstrapping--nonparametric-test\">Hypothesis testing methodology (bootstrapping + nonparametric test)<\/h3>\n\n\n\n<p>The protocol uses:&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Percentile bootstrap<\/strong>\u00a0for the difference of medians (e.g., ( \\Delta = \\text{median}(p99)_A &#8211; \\text{median}(p99)_B )).\n<ul class=\"wp-block-list\">\n<li>Resample each group with replacement (B) times (e.g., (B=10{,}000)), compute (\\Delta^{(b)}).<\/li>\n\n\n\n<li>The 95% confidence interval is ([\\Delta_{2.5%}, \\Delta_{97.5%}]).\u00a0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Mann\u2013Whitney U test<\/strong>\u00a0(two-sample rank test) as a nonparametric test of distributional shift (\u201ctends to be larger\u201d). Report: p-value and a probabilistic dominance interpretation (MW parameter).\u00a0<\/li>\n\n\n\n<li><strong>Effect size<\/strong>:\u00a0<strong>Cliff\u2019s delta<\/strong>\u00a0(dominance). A convenient interpretation is:<br>[ \\delta = P(X>Y) &#8211; P(X&lt;Y) ] where (X) comes from group A and (Y) from group B.\u00a0<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"example-statistical-results-simulated\">Example statistical results (simulated)<\/h3>\n\n\n\n<p>Table 3. Comparison using 10 independent runs (simulated). Reported: \u0394 median, bootstrap CI, bootstrap p-value, Mann\u2013Whitney p-value, MW probabilistic dominance ( \\varphi ), and Cliff\u2019s delta ( \\delta ).&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Comparison<\/th><th class=\"has-text-align-left\" data-align=\"left\">Metric<\/th><th class=\"has-text-align-right\" data-align=\"right\">median(A)<\/th><th class=\"has-text-align-right\" data-align=\"right\">median(B)<\/th><th class=\"has-text-align-right\" data-align=\"right\">\u0394 median(A\u2212B)<\/th><th class=\"has-text-align-left\" data-align=\"left\">95% bootstrap CI for \u0394<\/th><th class=\"has-text-align-right\" data-align=\"right\">p_bootstrap<\/th><th class=\"has-text-align-right\" data-align=\"right\">p_MW<\/th><th class=\"has-text-align-right\" data-align=\"right\">MW \u03d5<\/th><th class=\"has-text-align-right\" data-align=\"right\">Cliff\u2019s \u03b4<\/th><\/tr><\/thead><tbody><tr><td>vps_medium vs ded_small<\/td><td>fsync lat p99 (ms)<\/td><td class=\"has-text-align-right\" data-align=\"right\">34.889<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.865<\/td><td class=\"has-text-align-right\" data-align=\"right\">32.025<\/td><td>[31.073; 32.558]<\/td><td class=\"has-text-align-right\" data-align=\"right\">4.00e-05<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.83e-04<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><\/tr><tr><td>vps_premium vs ded_small<\/td><td>fsync lat p99 (ms)<\/td><td class=\"has-text-align-right\" data-align=\"right\">9.046<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.865<\/td><td class=\"has-text-align-right\" data-align=\"right\">6.181<\/td><td>[6.070; 6.934]<\/td><td class=\"has-text-align-right\" data-align=\"right\">4.00e-05<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.83e-04<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><\/tr><tr><td>vps_medium vs ded_small<\/td><td>RTT p99 (ms)<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.516<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.718<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.798<\/td><td>[1.746; 1.843]<\/td><td class=\"has-text-align-right\" data-align=\"right\">4.00e-05<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.83e-04<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><\/tr><tr><td>vps_medium vs vps_premium<\/td><td>CPU steal (%, fsync)<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.746<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.705<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.041<\/td><td>[0.751; 1.540]<\/td><td class=\"has-text-align-right\" data-align=\"right\">4.00e-05<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.83e-04<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.000<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Interpretation of MW \u03d5 and Cliff\u2019s \u03b4: both are dominance-style measures; values close to 1 indicate strong separation where group A tends to produce higher values than group B (here: higher latency or higher steal).&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"discussion-and-threats-to-validity\">Discussion and threats to validity<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"why-tail-latency-matters-more-than-averages\">Why tail latency matters more than averages<\/h3>\n\n\n\n<p>For many online services, \u201crare\u201d slow events become a material fraction of user-visible requests at scale (tail-at-scale effect). Variability sources\u2014queues, background activity, shared-resource contention\u2014are difficult to eliminate entirely.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"why-io-often-breaks-predictability-first\">Why I\/O often breaks predictability first<\/h3>\n\n\n\n<p>In multi-tenant infrastructure, shared storage and shared services are prone to interference and higher variability. Databases are particularly sensitive to disk behavior: interference and contention translate into application-level response-time variance and SLA degradation.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"steal-as-a-vps-differentiator\">%steal as a VPS differentiator<\/h3>\n\n\n\n<p>Steal time is CPU time needed by the guest but not provided by the host because resources were allocated elsewhere; it is observable in&nbsp;<code>\/proc\/stat<\/code>&nbsp;and standard monitoring tools.&nbsp;<br>Operationally: if tail latency and %steal rise together while guest CPU load appears \u201cnormal,\u201d the bottleneck is likely host-level CPU contention (typical under oversubscription). This is a concrete engineering input for choosing between shared VPS, \u201cguaranteed\u201d VPS, and Dedicated.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"limitations-and-threats-to-validity\">Limitations and threats to validity<\/h3>\n\n\n\n<p><strong>Simulated results vs live measurements.<\/strong>&nbsp;The Results values are not tied to any specific data center; they demonstrate reporting structure and typical effects from the literature (tail variability, multi-tenant interference, and %steal diagnostic value).&nbsp;<\/p>\n\n\n\n<p><strong>Instrumentation validity.<\/strong>&nbsp;fio percentile computation depends on internal accounting and can vary with logging\/aggregation mode; therefore, live studies should fix fio version, output format (JSON), and preserve raw artifacts.&nbsp;<\/p>\n\n\n\n<p><strong>Construct validity (synthetic vs production).<\/strong>&nbsp;fio\/sysbench\/iperf3\/pgbench capture important aspects but do not replace profiling of real applications; they remain useful as \u201cminimal reproducible\u201d tests for comparing infrastructure classes.&nbsp;<\/p>\n\n\n\n<p><strong>External validity (transferability).<\/strong>&nbsp;Results from one region\/storage class\/network may not transfer to others; multi-tenant background noise varies over time, so tests should be repeated in different time windows and reported via distributions\/percentiles rather than single numbers.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"practical-recommendations-decision-checklist-conclusion-and-appendix\">Practical recommendations, decision checklist, conclusion, and appendix<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"practical-recommendations-slorisk-language\">Practical recommendations (SLO\/risk language)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If the target service is\u00a0<strong>IO-bound<\/strong>\u00a0(databases, logs, queues with fsync, heavy writes), the key KPI is\u00a0<strong>p99 latency<\/strong>\u00a0under\u00a0<code>randwrite+fsync<\/code>. For stable p99 requirements, Dedicated or premium VPS with explicit CPU\/I\/O guarantees is often justified.\u00a0<\/li>\n\n\n\n<li>If the service is\u00a0<strong>CPU-bound<\/strong>\u00a0(rendering, compilation, pure compute, high-QPS processing), diagnose\u00a0<strong>%steal<\/strong>: persistent steal indicates shared-host CPU contention and supports choosing a guaranteed profile or Dedicated.\u00a0<\/li>\n\n\n\n<li>If the service is\u00a0<strong>network-bound<\/strong>\u00a0(proxy\/edge, highly \u201cchatty\u201d microservices), publish p95\/p99 RTT and jitter plus iperf3 throughput\/retransmits because network tail latency degrades distributed-system behavior.\u00a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"decision-checklist-engineering-questions-to-ask\">Decision checklist (engineering questions to ask)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>CPU:<\/strong>\u00a0oversubscription constraints\/guarantees, CPU pinning\/\u201cguaranteed vCPU,\u201d typical %steal for the SLA class.\u00a0<\/li>\n\n\n\n<li><strong>Storage:<\/strong>\u00a0local NVMe vs shared pool, QoS for IOPS\/latency, availability of latency metrics\/graphs.\u00a0<\/li>\n\n\n\n<li><strong>Network:<\/strong>\u00a0port speed (1G\/10G), rate-limit\/PPS policy, expected p95\/p99 RTT intra-region, isolation guarantees.\u00a0<\/li>\n\n\n\n<li><strong>Observability:<\/strong>\u00a0permission to run sysstat tooling and collect iostat\/sar\/pidstat; constraints on benchmarking.\u00a0<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h3>\n\n\n\n<p>A journal-style VPS vs Dedicated publication should be centered on&nbsp;<strong>latency distributions and their sources<\/strong>: tail latency (p95\/p99) and temporal variability are more informative than averages, while multi-tenant interference and CPU contention can be diagnosed via system metrics such as %steal.&nbsp;<br>The proposed protocol (repeats + long runs + telemetry + bootstrap\/Mann\u2013Whitney analysis) enables reproducible and comparable reporting across tariff classes without tying conclusions to specific providers.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"appendix-reproducibility-pack-bash-and-table-templates-with-filled-examples\">Appendix: reproducibility pack (bash) and table templates with filled examples<\/h3>\n\n\n\n<p>Below is a minimal bash command set to reproduce the protocol on any Linux host; parameters are explicit. Percentile interpretation follows fio documentation and standard \u201cX% of operations complete within \u2264 value\u201d semantics.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"environment-preparation\">Environment preparation<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>bash<code><em># OS: Ubuntu\/Debian (example)<\/em>\nsudo apt-get update\nsudo apt-get install -y fio sysbench iperf3 postgresql-contrib sysstat procps\n\n<em># Record OS and tool versions for the protocol<\/em>\nuname -a\nlsb_release -a || cat \/etc\/os-release\nfio --version\nsysbench --version\niperf3 --version\npgbench --version\n\n<em># CPU governor<\/em>\nfor c in \/sys\/devices\/system\/cpu\/cpu*\/cpufreq\/scaling_governor; do\n  echo performance | sudo tee \"$c\"\ndone\n\n<em># I\/O scheduler: inspect and (if needed) set<\/em>\nlsblk -d -o NAME,ROTA,TYPE,SIZE,MODEL\ncat \/sys\/block\/nvme0n1\/queue\/scheduler 2>\/dev\/null || true\necho none | sudo tee \/sys\/block\/nvme0n1\/queue\/scheduler 2>\/dev\/null || true\n<\/code><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"fio-short-runs-60s--10-repeats\">fio short runs (60s \u00d7 10 repeats)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>bash\n<code>TARGET_DIR=\/mnt\/bench\nmkdir -p \"$TARGET_DIR\"\n\n<em># 1) randread 4k, iodepth=32<\/em>\nfio --name=randread4k \\\n  --directory=\"$TARGET_DIR\" --filename=fiofile \\\n  --rw=randread --bs=4k --iodepth=32 --numjobs=1 \\\n  --direct=1 --size=4G --runtime=60 --time_based \\\n  --group_reporting --output-format=json \\\n  > fio_randread4k.json\n\n<em># 2) randwrite 4k, iodepth=32<\/em>\nfio --name=randwrite4k \\\n  --directory=\"$TARGET_DIR\" --filename=fiofile \\\n  --rw=randwrite --bs=4k --iodepth=32 --numjobs=1 \\\n  --direct=1 --size=4G --runtime=60 --time_based \\\n  --group_reporting --output-format=json \\\n  > fio_randwrite4k.json\n\n<em># 3) randwrite 4k + fsync, iodepth=1<\/em>\nfio --name=fsyncwrite4k \\\n  --directory=\"$TARGET_DIR\" --filename=fiofile \\\n  --rw=randwrite --bs=4k --iodepth=1 --numjobs=1 \\\n  --direct=1 --fsync=1 --size=2G --runtime=60 --time_based \\\n  --group_reporting --output-format=json \\\n  > fio_fsyncwrite4k.json\n<\/code><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"long-run-recommended-4h--telemetry\">Long run (recommended 4h) + telemetry<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>bash\n<code><em># 1-second telemetry (example)<\/em>\niostat -x 1 > iostat_1s.log &amp;\nIOSTAT_PID=$!\nvmstat 1 > vmstat_1s.log &amp;\nVMSTAT_PID=$!\nsar -u -r -d 1 > sar_1s.log &amp;\nSAR_PID=$!\n\n<em># 4 hours = 14400 seconds<\/em>\nfio --name=fsyncwrite4k_long \\\n  --directory=\"$TARGET_DIR\" --filename=fiofile \\\n  --rw=randwrite --bs=4k --iodepth=1 --numjobs=1 \\\n  --direct=1 --fsync=1 --size=2G --runtime=14400 --time_based \\\n  --group_reporting --output-format=json \\\n  > fio_fsyncwrite4k_4h.json\n\nkill $IOSTAT_PID $VMSTAT_PID $SAR_PID\n<\/code><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"network-iperf3--ping\">Network (iperf3 + ping)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>bash\n<code><em># On server:<\/em>\niperf3 -s\n\n<em># On client:<\/em>\niperf3 -c &lt;SERVER_IP> -t 60 -J > iperf3_tcp_60s.json\nping -i 0.2 -c 300 &lt;TARGET_IP> > ping_300.log\n<\/code><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"pgbench-optional-database-class-signal\">pgbench (optional, database-class signal)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>bash\n<code>createdb pgbench\npgbench -i -s 10 pgbench\n\npgbench -c 10 -j 4 -T 60 -P 10 -l pgbench > pgbench_run1.log\npgbench -c 10 -j 4 -T 60 -r pgbench > pgbench_run1_percmd.log\n<\/code><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"table-templates-filled-example-structure-not-empty\">Table templates (filled example structure, not empty)<\/h4>\n\n\n\n<p>Table A1. Host specification report (example layout with the representative configurations used in this paper).&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Parameter<\/th><th class=\"has-text-align-left\" data-align=\"left\">small VPS<\/th><th class=\"has-text-align-left\" data-align=\"left\">medium VPS<\/th><th class=\"has-text-align-left\" data-align=\"left\">premium VPS<\/th><th class=\"has-text-align-left\" data-align=\"left\">dedicated small<\/th><th class=\"has-text-align-left\" data-align=\"left\">dedicated large<\/th><\/tr><\/thead><tbody><tr><td>CPU<\/td><td>1 vCPU (shared)<\/td><td>2 vCPU (shared)<\/td><td>4 vCPU (guaranteed)<\/td><td>4 cores<\/td><td>8 cores<\/td><\/tr><tr><td>RAM<\/td><td>2 GB<\/td><td>4 GB<\/td><td>8 GB<\/td><td>16 GB<\/td><td>32 GB<\/td><\/tr><tr><td>Storage<\/td><td>SSD (SATA class)<\/td><td>NVMe<\/td><td>NVMe + QoS<\/td><td>1\u00d7NVMe<\/td><td>2\u00d7NVMe<\/td><\/tr><tr><td>Network<\/td><td>1G class<\/td><td>1G class<\/td><td>1G class<\/td><td>1G<\/td><td>10G<\/td><\/tr><tr><td>OS\/kernel<\/td><td>Ubuntu 24.04 \/ 6.8.x<\/td><td>same<\/td><td>same<\/td><td>same<\/td><td>same<\/td><\/tr><tr><td>Governor<\/td><td>performance<\/td><td>performance<\/td><td>performance<\/td><td>performance<\/td><td>performance<\/td><\/tr><tr><td>I\/O scheduler<\/td><td>mq-deadline<\/td><td>none<\/td><td>none<\/td><td>none<\/td><td>none<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Table A2. fio reporting template (example populated with the fsync p99 line from Results).&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Profile<\/th><th class=\"has-text-align-left\" data-align=\"left\">Configuration<\/th><th class=\"has-text-align-right\" data-align=\"right\">IOPS<\/th><th class=\"has-text-align-right\" data-align=\"right\">BW (MiB\/s)<\/th><th class=\"has-text-align-right\" data-align=\"right\">clat p50 (ms)<\/th><th class=\"has-text-align-right\" data-align=\"right\">clat p95 (ms)<\/th><th class=\"has-text-align-right\" data-align=\"right\">clat p99 (ms)<\/th><th class=\"has-text-align-right\" data-align=\"right\">%steal<\/th><th class=\"has-text-align-right\" data-align=\"right\">%iowait<\/th><\/tr><\/thead><tbody><tr><td>randwrite 4k + fsync qd1<\/td><td>vps_medium<\/td><td class=\"has-text-align-right\" data-align=\"right\">880<\/td><td class=\"has-text-align-right\" data-align=\"right\">3.4<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.021<\/td><td class=\"has-text-align-right\" data-align=\"right\">9.378<\/td><td class=\"has-text-align-right\" data-align=\"right\">34.889<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.746<\/td><td class=\"has-text-align-right\" data-align=\"right\">7.361<\/td><\/tr><tr><td>randwrite 4k + fsync qd1<\/td><td>ded_small<\/td><td class=\"has-text-align-right\" data-align=\"right\">2,225<\/td><td class=\"has-text-align-right\" data-align=\"right\">8.7<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.402<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.538<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.865<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.053<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.552<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Executive summary VPS and Dedicated differ less in \u201caverage speed\u201d than in&nbsp;latency predictability&nbsp;(p95\/p99) and resilience to multi-tenant interference (\u201cnoisy neighbor\u201d), which tends to be most visible in storage I\/O and networking.&nbsp;A key diagnostic indicator of CPU contention on VPS is&nbsp;CPU steal time&nbsp;(visible in&nbsp;\/proc\/stat,&nbsp;top,&nbsp;vmstat), reflecting CPU time taken by the hypervisor in favor of other guests.&nbsp;This [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[171],"tags":[175,177,174,176,172],"class_list":["post-701","post","type-post","status-publish","format-standard","hentry","category-lab-tests","tag-dedicated-server-performance","tag-hosting-lab-tests","tag-storage-i-o-performance","tag-vps-performance","tag-vps-vs-dedicated"],"_links":{"self":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts\/701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/comments?post=701"}],"version-history":[{"count":1,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts\/701\/revisions"}],"predecessor-version":[{"id":703,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts\/701\/revisions\/703"}],"wp:attachment":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/media?parent=701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/categories?post=701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/tags?post=701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}