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 tier | Sustained 4K random read | Latency under load |
|---|---|---|
| Budget shared SSD | 500–2,000 IOPS | 5–50 ms |
| Mid-range SATA SSD | 5,000–20,000 IOPS | 0.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
You must be logged in to post a comment.