{"id":433,"date":"2026-06-18T11:48:37","date_gmt":"2026-06-18T11:48:37","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=433"},"modified":"2026-09-21T22:04:36","modified_gmt":"2026-09-21T22:04:36","slug":"how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/","title":{"rendered":"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A single <code>fio<\/code> run tells you one number and hides four. To characterise a VPS disk you need a small matrix of tests \u2014 random and sequential, read and write, blocked and unblocked \u2014 because providers throttle on different axes and the throttled axis is the one that will hurt you in production. This plan takes about twenty minutes on an idle box and produces numbers you can compare across plans or across months.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rules before you start<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run on an empty test file in a directory that is <em>not<\/em> the one serving your site. Writing 4 GB will evict the page cache and momentarily degrade the live application.<\/li>\n<li>Never write directly to a raw device on a VPS \u2014 you do not own the block device, and the provider&#8217;s snapshot layer may not expect it.<\/li>\n<li>Record the file size. A test whose working set fits in page cache measures RAM, not disk. Use <code>--size<\/code> at least 2\u00d7 the memory you expect the provider to cache, and <code>--direct=1<\/code> to bypass cache entirely.<\/li>\n<li>Fix the runtime with <code>--time_based --runtime=60<\/code> so every test is comparable and no single test runs long enough to trigger sustained-IOPS penalties before you intend it to.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The five tests that matter<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>#<\/th><th>Profile<\/th><th>Represents<\/th><th>Key metric<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>4k randread, QD32<\/td><td>Database index lookups<\/td><td>IOPS, p99 latency<\/td><\/tr><tr><td>2<\/td><td>4k randwrite, QD32<\/td><td>InnoDB WAL, log writes<\/td><td>IOPS, p99 latency<\/td><\/tr><tr><td>3<\/td><td>128k seqread, QD1<\/td><td>Cold file reads, backups<\/td><td>MiB\/s<\/td><\/tr><tr><td>4<\/td><td>1M seqwrite, QD8<\/td><td>Large dumps and imports<\/td><td>MiB\/s<\/td><\/tr><tr><td>5<\/td><td>4k randread, QD1<\/td><td>Latency floor<\/td><td><code>clat<\/code> p99 alone<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Test 5 is the one people skip and it is the most revealing. At queue depth 1 you are measuring the device&#8217;s intrinsic latency with no parallelism to hide it, which is what a single-threaded PHP request actually experiences. If test 1 reports 40,000 IOPS but test 5 shows a 9 ms p99, your app will feel slow under any concurrency. Different instance types have very different memory ceilings as well as disk ceilings, which is why both numbers belong in the same buying decision \u2014 <a href=\"https:\/\/virtualserversvps.com\/\">see the full specs and pricing<\/a> to make that comparison concrete.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Running the suite<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>apt install -y fio\nmkdir -p \/root\/fiotest && cd \/root\/fiotest\n\n# Prepare a 4 GiB file once, then reuse it for read tests\nfio --name=prep --filename=fiotest.dat --size=4G --rw=write \\\n    --bs=1M --direct=1 --ioengine=libaio --group_reporting\n\n# Test 1: random read IOPS\nfio --name=randread --filename=fiotest.dat --rw=randread --bs=4k \\\n    --iodepth=32 --direct=1 --ioengine=libaio --time_based \\\n    --runtime=60 --group_reporting\n\n# Test 5: latency floor, no queueing\nfio --name=latency --filename=fiotest.dat --rw=randread --bs=4k \\\n    --iodepth=1 --direct=1 --ioengine=libaio --time_based \\\n    --runtime=60 --group_reporting<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Reading the output correctly<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ignore the summary&#8217;s <code>iops<\/code> line until you have read latency. The useful block looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  read: IOPS=12.4k, BW=48.4MiB\/s (50.8MB\/s)\n    lat (usec): min=180, max=41201, avg=2570.44\n    clat percentiles (usec):\n     |  1.00th=[  404],  5.00th=[  519], 10.00th=[  619],\n     | 50.00th=[ 1188], 90.00th=[ 5408], 95.00th=[ 6745],\n     | 99.00th=[10816], 99.50th=[12544], 99.90th=[18048]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Read two things. First, the spread between p50 and p99: a 1.2 ms median with a 10.8 ms p99 is a device with unpredictable tail latency, typically a shared network-backed volume where a neighbouring tenant is bursting. Second, compare <code>p99<\/code> across runs \u2014 if test 1 and test 5 have nearly identical p99 values, adding queue depth bought you nothing and the device is already saturated.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hunting for throttle ceilings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most VPS providers cap sustained IOPS. The cap is invisible until you cross it. To find it, run a longer burst and watch for a step change rather than a curve:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 5 minutes of sustained random write, sampled every second\nfio --name=burst --filename=fiotest.dat --rw=randwrite --bs=4k \\\n    --iodepth=32 --direct=1 --ioengine=libaio --time_based \\\n    --runtime=300 --group_reporting --eta=always --eta-interval=1\n\n# Watch the kernel's own view from a second shell\niostat -x 1 | awk 'NR==3 || $1 ~ \/^(sd|nvme|vd)\/'\ncat \/proc\/pressure\/io    # PSI: some avg10 rising means real queueing<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A smooth IOPS decline over five minutes is normal page-cache and journal behaviour. A sudden drop to a fixed plateau \u2014 say 12,000 IOPS down to 2,500 and staying there \u2014 is a provisioning policy. That plateau is the number to plan against, because a nightly backup plus a database dump can hit it simultaneously and neither will report an error; they will both simply take four times longer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Turning numbers into a decision<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Record every run with its timestamp, file size, and hostname. Disk performance on shared storage changes as the host fills up.<\/li>\n<li>If p99 latency exceeds roughly 20 ms at queue depth 1, that instance cannot serve a latency-sensitive database comfortably.<\/li>\n<li>If sustained IOPS is under half the burst figure, size your backup window for the sustained number.<\/li>\n<li>Re-run the suite after any provider-side migration or plan change. Assumptions have a shelf life.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Adopting a fixed run cadence matters more than any single test. Run the suite on the day you provision an instance, then again after the host has been live for a month \u2014 shared storage performance tends to drift as the physical host fills up. Keeping the JSON output of each run (<code>--output-format=json<\/code>) in version control turns a pile of anecdote into a trend line you can point at when a provider claims nothing changed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When the numbers say the disk is the wall, no amount of application tuning will move it \u2014 and that is useful information rather than a dead end. Layer these results against the CPU and memory ceilings you have already measured: <a href=\"https:\/\/virtualserversvps.com\/\">Our VPS comparison page<\/a> puts storage tiers beside those figures instead of leaving you to guess from marketing IOPS claims.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A single fio run tells you one number and hides four. To characterise a VPS disk you need a small matrix of tests \u2014 random and sequential, read and write,&#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":8,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-433","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>A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings - Virtual Servers VPS Blog<\/title>\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\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings\" \/>\n<meta property=\"og:description\" content=\"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-18T11:48:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-21T22:04:36+00:00\" \/>\n<meta name=\"author\" content=\"Virtual-Servers-Vps-Editor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Virtual-Servers-Vps-Editor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/\",\"name\":\"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-06-18T11:48:37+00:00\",\"dateModified\":\"2026-09-21T22:04:36+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings\"}]},{\"@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":"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings - Virtual Servers VPS Blog","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\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/","og_locale":"en_US","og_type":"article","og_title":"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings","og_description":"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings","og_url":"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-06-18T11:48:37+00:00","article_modified_time":"2026-09-21T22:04:36+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/","url":"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/","name":"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-06-18T11:48:37+00:00","dateModified":"2026-09-21T22:04:36+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/how-to-monitor-vps-network-latency-and-packet-loss-tools-and-best-practices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Practical fio Test Plan for Measuring VPS Disk IOPS, Latency and Throttle Ceilings"}]},{"@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\/433","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=433"}],"version-history":[{"count":2,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/433\/revisions"}],"predecessor-version":[{"id":1193,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/433\/revisions\/1193"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}