{"id":1309,"date":"2026-09-28T02:00:37","date_gmt":"2026-09-28T02:00:37","guid":{"rendered":"https:\/\/affordablevpsserver.com\/blog\/?p=1309"},"modified":"2026-09-28T02:00:37","modified_gmt":"2026-09-28T02:00:37","slug":"vps-nvme-iops-benchmark-methodology","status":"publish","type":"post","link":"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/","title":{"rendered":"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Two servers can both say &#8220;NVMe SSD&#8221; and deliver wildly different database performance. The difference is IOPS under concurrency, and it is invisible unless you measure it correctly. Most people run a single sequential read, get a big number, and conclude the disk is fast. This guide shows the fio settings that actually reveal a plan&#8217;s storage behaviour.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Single-Stream Tests Mislead<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A sequential read measures bandwidth, not IOPS. Databases, mail servers, and container hosts care about <em>random 4K<\/em> operations at depth. A budget NVMe pool with a hard IOPS ceiling can still push 1 GB\/s sequentially while collapsing to 300 IOPS at random, which is what makes a MySQL query take 400 ms instead of 4 ms. If you only ever ran <code>dd<\/code>, you never saw the ceiling.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Four Tests Worth Running<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Random read, 4K, queue depth 32<\/strong> \u2014 the single most representative number for database work.<\/li><li><strong>Random write, 4K, queue depth 32<\/strong> \u2014 reveals write amplification and thin-provisioning penalties.<\/li><li><strong>Mixed 70\/30 read\/write, 4K<\/strong> \u2014 closer to a real web application workload.<\/li><li><strong>Sequential read, 1M<\/strong> \u2014 useful only as a bandwidth ceiling check.<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">The Commands<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Install fio (<code>apt install fio<\/code>) and run each test against a real file, not a RAM-backed path. Use a 4 GB file so caching cannot flatter the result, and give each test 60 seconds. Run them in the order listed so a write test does not warm the page cache for the read test.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>fio --name=randread --rw=randread --bs=4k --iodepth=32 --size=4G --runtime=60 --time_based --filename=\/root\/ioftest --group_reporting<\/code><\/li><li><code>fio --name=randwrite --rw=randwrite --bs=4k --iodepth=32 --size=4G --runtime=60 --time_based --filename=\/root\/ioftest --group_reporting<\/code><\/li><li><code>fio --name=mixed --rw=randrw --rwmixread=70 --bs=4k --iodepth=32 --size=4G --runtime=60 --time_based --filename=\/root\/ioftest --group_reporting<\/code><\/li><li><code>fio --name=seqread --rw=read --bs=1M --iodepth=8 --size=4G --runtime=60 --time_based --filename=\/root\/ioftest --group_reporting<\/code><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reading the Output<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Metric<\/th><th>Where to find it<\/th><th>What good looks like<\/th><\/tr><\/thead><tbody><tr><td>IOPS<\/td><td><code>iops=<\/code> in the report<\/td><td>4K random read &gt;2,000 on budget plans; &gt;10,000 on real NVMe<\/td><\/tr><tr><td>clat (completion latency)<\/td><td><code>clat<\/code> percentiles<\/td><td>p99 under 5 ms is healthy; over 20 ms causes visible app lag<\/td><\/tr><tr><td>latency distribution<\/td><td><code>lat (msec)<\/code> block<\/td><td>Most operations in the first two buckets<\/td><\/tr><tr><td>Bandwidth<\/td><td><code>bw=<\/code><\/td><td>Sequential matters only for large file transfer<\/td><\/tr><\/tbody><\/table>\n\n\n\n<p class=\"wp-block-paragraph\">The number to watch is <strong>p99 completion latency<\/strong>, not the headline IOPS. A disk averaging 4,000 IOPS with a p99 of 60 ms will produce occasional 500 ms page loads. One averaging 1,500 IOPS with a p99 of 3 ms feels instant. Averages hide the tail that users actually notice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Interpreting What You See<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Pattern<\/th><th>Likely cause<\/th><th>Action<\/th><\/tr><\/thead><tbody><tr><td>IOPS flat regardless of queue depth<\/td><td>Provider IOPS cap per volume<\/td><td>Move data to a plan with higher cap, or reduce random IO<\/td><\/tr><tr><td>Random write far below read<\/td><td>Thin provisioning \/ shared write cache<\/td><td>Enable write-back caching at the app layer, batch writes<\/td><\/tr><tr><td>p99 latency spikes every ~30 s<\/td><td>Noisy neighbour or host-level backup job<\/td><td>Re-test at different times; escalate with evidence<\/td><\/tr><tr><td>Excellent now, poor after 3 months<\/td><td>Data moved to a slower host pool<\/td><td>Re-run quarterly; keep historical CSVs<\/td><\/tr><\/tbody><\/table>\n\n\n\n<h2 class=\"wp-block-heading\">Reducing IO Pressure Without Changing Plans<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Increase MySQL <code>innodb_buffer_pool_size<\/code> so more reads hit RAM instead of disk.<\/li><li>Batch small writes \u2014 a single 100-row insert beats 100 single-row inserts.<\/li><li>Move logs and temp tables to a separate volume if your provider offers one.<\/li><li>Turn on the OS write cache (<code>vm.dirty_ratio<\/code> tuned, not left at default) for bursty workloads.<\/li><li>Enable <code>noatime<\/code> on the data mount \u2014 it removes a metadata write on every file read.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Store each run&#8217;s CSV in a version-controlled folder. Storage performance on shared infrastructure drifts, and having three months of history turns a vague complaint into a support ticket with evidence. Most providers respond very differently when you can show a before-and-after table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the numbers show a genuine storage ceiling, the answer is not always a bigger plan \u2014 sometimes it is separating workloads so only the database sits on fast storage. You can <a href=\"https:\/\/affordablevpsserver.com\/\">compare budget VPS plans on our comparison table<\/a> and check per-plan storage specs, then pair the results with our guide to <a href=\"https:\/\/affordablevpsserver.com\/blog\/server-storage-cost-per-gigabyte-block-object-included\/\">server storage cost per gigabyte<\/a> to avoid paying for capacity you do not use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It also pays to understand where your storage stops being the bottleneck. Our breakdown of <a href=\"https:\/\/affordablevpsserver.com\/blog\/where-cheap-vps-plans-break-first-stress-test\/\">where budget VPS plans break first<\/a> covers how IOPS, RAM, and CPU interact, so you can tell whether a slow query is really a disk problem or a memory problem masquerading as one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Re-run the full sequence after any migration or &#8220;hardware upgrade&#8221; email. It is the fastest way to confirm that a promised improvement actually reached your instance \u2014 and the fastest way to catch the opposite.<\/p>\n\n\n<h2 class=\"wp-block-heading\">Benchmarking Across Time, Not Just Once<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A single benchmark is a snapshot; a series of them is a diagnostic tool. Run the same four fio tests once a month and keep the CSVs in one folder. After three months you have a baseline, and any deviation becomes visible immediately. A sudden 40% drop in random-read IOPS with no change on your side usually means the provider moved your volume or added tenants to the host \u2014 both worth a support ticket, and both almost impossible to prove without history.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Time your tests to the same hour each run. Storage performance on shared infrastructure follows a daily cycle: evening hours in the datacenter&#8217;s primary timezone are usually the busiest, and a test run at 3 a.m. will flatter a plan that struggles at 8 p.m. If your application serves users during peak hours, benchmark during peak hours. A number that only holds at 3 a.m. is not the number your users experience.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, document the CPU model alongside each storage result. Providers occasionally migrate instances to newer hosts, and a storage regression can be offset by a CPU gain \u2014 or vice versa. Without recording both, you cannot tell which change you are actually observing.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Two servers can both say &#8220;NVMe SSD&#8221; and deliver wildly different database performance. The difference is IOPS under concurrency, and it is invisible unless you measure it correctly. Most people run a single sequential read, get a big number, and conclude the disk is fast. This guide shows the fio settings that actually reveal a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1309","post","type-post","status-publish","format-standard","hentry","category-budget-vps-guides"],"blocksy_meta":[],"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>Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results - Affordable VPS Server Blog<\/title>\n<meta name=\"description\" content=\"Two servers can both say &quot;NVMe SSD&quot; and deliver wildly different database performance. The difference is IOPS under concurrency, and it is invisible\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results\" \/>\n<meta property=\"og:description\" content=\"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results\" \/>\n<meta property=\"og:url\" content=\"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/\" \/>\n<meta property=\"og:site_name\" content=\"Affordable VPS Server Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-28T02:00:37+00:00\" \/>\n<meta name=\"author\" content=\"Affordable-Vps-Server-Author\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Affordable-Vps-Server-Author\" \/>\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:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/\",\"url\":\"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/\",\"name\":\"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results - Affordable VPS Server Blog\",\"isPartOf\":{\"@id\":\"https:\/\/affordablevpsserver.com\/blog\/#website\"},\"datePublished\":\"2026-09-28T02:00:37+00:00\",\"author\":{\"@id\":\"https:\/\/affordablevpsserver.com\/blog\/#\/schema\/person\/685a02c93a3c45030f7427ec928b0df7\"},\"description\":\"Two servers can both say \\\"NVMe SSD\\\" and deliver wildly different database performance. The difference is IOPS under concurrency, and it is invisible\",\"breadcrumb\":{\"@id\":\"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/affordablevpsserver.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/affordablevpsserver.com\/blog\/#website\",\"url\":\"https:\/\/affordablevpsserver.com\/blog\/\",\"name\":\"Affordable VPS Server Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/affordablevpsserver.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/affordablevpsserver.com\/blog\/#\/schema\/person\/685a02c93a3c45030f7427ec928b0df7\",\"name\":\"Affordable-Vps-Server-Author\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/affordablevpsserver.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8fa20973a7dd04621d396c26ba26b5c5e6c19595583335121958527393f6f95e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8fa20973a7dd04621d396c26ba26b5c5e6c19595583335121958527393f6f95e?s=96&d=mm&r=g\",\"caption\":\"Affordable-Vps-Server-Author\"},\"sameAs\":[\"https:\/\/affordablevpsserver.com\/blog\"],\"url\":\"https:\/\/affordablevpsserver.com\/blog\/author\/affordablevpsserver\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results - Affordable VPS Server Blog","description":"Two servers can both say \"NVMe SSD\" and deliver wildly different database performance. The difference is IOPS under concurrency, and it is invisible","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:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/","og_locale":"en_US","og_type":"article","og_title":"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results","og_description":"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results","og_url":"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/","og_site_name":"Affordable VPS Server Blog","article_published_time":"2026-09-28T02:00:37+00:00","author":"Affordable-Vps-Server-Author","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Affordable-Vps-Server-Author","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/","url":"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/","name":"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results - Affordable VPS Server Blog","isPartOf":{"@id":"https:\/\/affordablevpsserver.com\/blog\/#website"},"datePublished":"2026-09-28T02:00:37+00:00","author":{"@id":"https:\/\/affordablevpsserver.com\/blog\/#\/schema\/person\/685a02c93a3c45030f7427ec928b0df7"},"description":"Two servers can both say \"NVMe SSD\" and deliver wildly different database performance. The difference is IOPS under concurrency, and it is invisible","breadcrumb":{"@id":"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/affordablevpsserver.com\/blog\/vps-nvme-iops-benchmark-methodology\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/affordablevpsserver.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Benchmarking VPS NVMe IOPS the Right Way: fio Settings, Block Sizes, and Interpreting Results"}]},{"@type":"WebSite","@id":"https:\/\/affordablevpsserver.com\/blog\/#website","url":"https:\/\/affordablevpsserver.com\/blog\/","name":"Affordable VPS Server Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/affordablevpsserver.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/affordablevpsserver.com\/blog\/#\/schema\/person\/685a02c93a3c45030f7427ec928b0df7","name":"Affordable-Vps-Server-Author","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/affordablevpsserver.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8fa20973a7dd04621d396c26ba26b5c5e6c19595583335121958527393f6f95e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8fa20973a7dd04621d396c26ba26b5c5e6c19595583335121958527393f6f95e?s=96&d=mm&r=g","caption":"Affordable-Vps-Server-Author"},"sameAs":["https:\/\/affordablevpsserver.com\/blog"],"url":"https:\/\/affordablevpsserver.com\/blog\/author\/affordablevpsserver\/"}]}},"_links":{"self":[{"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/posts\/1309","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/comments?post=1309"}],"version-history":[{"count":1,"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/posts\/1309\/revisions"}],"predecessor-version":[{"id":1315,"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/posts\/1309\/revisions\/1315"}],"wp:attachment":[{"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/media?parent=1309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/categories?post=1309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/affordablevpsserver.com\/blog\/wp-json\/wp\/v2\/tags?post=1309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}