Understanding VPS I/O Limits and Disk Throttling: What Your Provider Isn’t Telling You

Disk I/O is the most throttled resource on a VPS. CPU and RAM are easy to verify, but storage performance is where providers quietly cut corners: IOPS caps, burst credits, and bandwidth ceilings are buried in fine print, and a marketing page that promises “fast NVMe” rarely tells you what happens after your burst allowance runs out. If you run a database, build pipelines, or take backups on your VPS, understanding how I/O limits work — and how to measure the limits your provider actually enforces — will save you from mysterious performance cliffs.

How Providers Enforce I/O Limits

Almost every VPS provider uses one or more of these mechanisms on its shared storage layer:

  • Sustained IOPS caps: a hard ceiling on read/write operations per second, often applied per VM via cgroup or storage QoS
  • Burst credits: a short window of full-speed I/O that refills over time — great for benchmarks, misleading for steady workloads
  • Bandwidth ceilings: a cap on MB/s throughput that is separate from the IOPS cap
  • Post-burst throttling: after credits are exhausted, throughput drops to a small fraction (sometimes 5–20%) of the burst rate

The burst model is the one that causes the most confusion: a fresh instance benchmarks beautifully for the first minute, then falls off a cliff when the credit bucket empties. That is not a fault in your configuration — it is the designed behavior of the storage tier you are paying for.

Measuring What You Actually Get

The standard tool is fio: sudo apt install -y fio on Debian/Ubuntu. Start with a 4K random-read test, which reflects the access pattern of databases and package managers:

fio --name=randread --rw=randread --bs=4k --size=1G --runtime=60 --iodepth=32 --numjobs=4 --group_reporting

Then test random writes, always with direct I/O so results reflect the device rather than the page cache: fio --name=randwrite --rw=randwrite --bs=4k --size=1G --runtime=60 --iodepth=16 --direct=1 --group_reporting. Without --direct=1, writes land in RAM first and the numbers look flattering but meaningless.

Latency matters just as much as throughput. Run ioping -c 20 . to measure round-trip I/O latency: a healthy SSD tier returns sub-millisecond results, while throttled budget tiers often show 5–50 ms under load. Finally, run a long burst test to find the credit window: fio --name=burst --rw=randread --bs=4k --size=4G --runtime=300 --iodepth=32 --group_reporting and watch the IOPS curve over five minutes. The point where it drops is your real sustained limit.

When reading fio output, look for the read: IOPS= and bw= lines in the summary. The reported slat (submission latency) and clat (completion latency) percentiles tell you whether the storage layer is adding consistent overhead or only struggling under queue depth. A provider that caps IOPS will show a flat, perfectly linear IOPS line once the cap is reached; an uncapped shared array shows noisier, less predictable numbers because you are competing with neighbors.

Watching I/O Over Time

Single benchmarks are snapshots; throttling often appears only under sustained load or during provider peak hours. Install sysstat and keep iostat -x 5 running while your workload runs: watch %util (how busy the device is), await (average I/O response time), and w_await (write latency). Consistently high await with low %util points to remote or contended storage rather than a saturated local disk. Pair this with vmstat 1 to correlate I/O stalls with CPU steal — sometimes the “disk problem” is actually the hypervisor pausing your vCPUs.

Storage tierSustained 4K random readLatency under load
Budget shared SSD500–2,000 IOPS5–50 ms
Mid-range SATA SSD5,000–20,000 IOPS0.5–2 ms
NVMe (dedicated or near-dedicated)20,000–100,000+ IOPS< 0.5 ms

What to Check Before You Buy

  • Look for documented IOPS and bandwidth caps in the provider’s docs, not just “SSD” or “NVMe” labels
  • Ask support directly for the sustained (non-burst) IOPS number on the plan you are considering
  • Check how long the burst window lasts and how long refill takes
  • Treat “unlimited I/O” claims with suspicion — someone is always sharing the array
  • Run your fio tests during the provider’s peak hours before committing

Living Within the Limits

If your plan is throttled, a few configuration choices soften the blow. Use ext4 or XFS with the right mount options for your workload, and set the I/O scheduler to none (or mq-deadline for mixed workloads) with echo none > /sys/block/vda/queue/scheduler. Reduce fsync pressure in databases — for MySQL, innodb_flush_log_at_trx_commit=2 trades a little durability for far fewer writes. Keep scratch files in tmpfs, batch small writes in application code, and give your database a bigger cache so reads rarely hit disk. When comparing plans, the storage and I/O feature comparison at virtualserversvps.com is a useful shortcut for spotting which providers disclose real sustained IOPS numbers, and the FAQ section answers common questions about burst credits and throttling behavior.

If sustained I/O matters for your workload, pick a plan that publishes its limits instead of one that hides them. Compare providers with transparent storage specs and find the right tier for your data.

Leave a Reply