TL;DR / Summary: A cheap VPS can look fine on paper and still deliver a fraction of its advertised disk speed because the host oversold the array. Steady-state latency and write jitter expose it in ten minutes, long before your database does.
What “oversold” actually means on a VPS
Virtualisation lets a host sell the same physical cores and spindles several times over. CPU oversubscription is usually tolerable because most tenants idle. Disk oversubscription is not, because storage latency is cumulative: every tenant’s write queue joins the same device queue.
The symptoms are familiar. A WordPress admin takes nine seconds to load a page, a database import crawls, and top shows almost no CPU usage. Nothing is broken, which is why support tickets go nowhere.
You cannot see the neighbour’s usage directly. What you can measure is the effect: latency that spikes under load you did not create.
Three measurements worth running
Start with sequential write throughput, then random read latency, then a sustained hold to see whether the numbers collapse after the initial burst.
The burst is the trick to watch for. Many hosts buffer writes in RAM or on a fast tier, so the first few gigabytes look excellent. Once the cache fills, a budget node drops to a fraction of the earlier figure. A thirty-second test will never see that; a two-minute test usually will.
A quick diagnostic sequence
- Baseline: write 1 GB sequentially and note the average rate
- Sustained: repeat immediately; compare the second run to the first
- Random access: small reads across many blocks, looking at the worst-case latency
- Jitter: record the spread, not just the mean — a wide spread is the real complaint
- Neighbour check: run the same test at three times of day and compare
Record the numbers with timestamps. A single slow afternoon is noise; the same pattern every evening is contention.
Reading the results like an engineer
Sequential throughput below what the plan advertises is a marketing problem. High percentiles of random read latency — the 95th and 99th — are an infrastructure problem, and they matter more for databases and web apps than peak throughput.
If the 99th percentile is many times the median, the array is queueing. Your queries wait behind someone else’s backup job, and no amount of application tuning will fix it.
A mean latency figure hides exactly the stalls your users complain about.
Compare against a reference you trust: a local SSD, a well-known cloud volume, or a previous host. Absolute numbers mean little without a baseline.
Confirming the cause before you complain
Rule out your own workload first. Check whether a cron job, a backup, or a log rotation is running during the test. Check swap: a node that is swapping will look exactly like a node with a saturated disk.
Look at steal time in top if the virtualisation exposes it. High steal points at CPU contention, which often arrives alongside disk contention on the same crowded host.
Then repeat the test from a fresh snapshot or a rescue environment. If the numbers are equally bad with your application stopped, the host is the variable, not your code.
What to do with the evidence
Open a ticket with numbers, not adjectives. “Sustained writes drop from 240 MB/s to 18 MB/s after forty seconds, reproducible at 20:00 daily” gets a different response from “the server is slow”.
Ask directly whether the node is on shared spinning storage or a throttled tier. Some budget plans are explicitly throttled, and knowing that saves a week of investigation.
If the answer is a polite non-answer, migrate. Moving a small VPS is an evening’s work; living with a contended disk is a permanent tax on every page load.
Choosing better next time
Prefer providers that publish IOPS limits rather than describing storage as “fast SSD”. A stated limit is a contract; an adjective is not.
Test before you commit to an annual term. Most hosts offer hourly or monthly billing, and one month of measurement is worth more than three reviews.
Keep the test scripted and repeatable so you can run it on a candidate instance in minutes. A short checklist beats intuition, and the numbers travel with you across providers when you compare options on budget VPS plans.
Finally, size for the workload you have. An oversold 1 GB node running a static site is fine; the same node running a write-heavy database is a support ticket waiting to happen.
Testing at the same time each day
Contention follows other tenants’ schedules. A single test at noon tells you nothing about the evening, when backups and batch jobs run.
Run the same script at three fixed times and compare. Consistency across days is what turns three samples into a pattern.
A measurement without a schedule is an anecdote.
