Every VPS provider now advertises “SSD” or “NVMe” storage, but the real performance difference depends less on the interface standard and more on how the provider provisions, shares, and throttles the underlying flash. This guide gives you a repeatable benchmarking methodology, explains what the fio numbers actually mean for your workload, and shows how to compare storage performance across providers before you commit.
The Technical Difference: SATA SSD vs. NVMe
The interface is the primary differentiator. SATA SSDs use the AHCI protocol, originally designed for mechanical hard drives, with a single command queue capped at 32 entries. NVMe uses the PCI Express bus directly with up to 65,535 queues and 65,535 commands per queue. This architectural difference drives the performance gap:
| Property | SATA SSD | NVMe |
|---|---|---|
| Interface | SATA 3.0 / AHCI | PCIe 3.0/4.0 / NVMe |
| Max queue depth | 32 | 65,535 |
| 4K random read IOPS (typical) | 20,000–100,000 | 200,000–1,000,000+ |
| 4K random read latency | 100–500 µs | 20–100 µs |
| Sequential read (typical) | ~550 MB/s | 1,500–7,000 MB/s |
| Common in VPS plans | Budget / older hosts | Current mainstream |
However, these are raw hardware numbers. On a shared VPS host, your “NVMe” drive is a virtualized slice of a larger NVMe array shared among dozens of tenants. The provider’s over-provisioning ratio, I/O scheduling, and throttling policies often matter more than the raw interface speed.
Benchmarking Storage on a VPS: A Repeatable Method
Use fio for rigorous testing and ioping for quick latency checks. Always test at different times of day (three runs minimum) to capture the variance caused by noisy neighbors.
Random Read IOPS (4K)
This is the most relevant benchmark for database workloads. A 4K random read is the typical database page size for MySQL and PostgreSQL:
# 4K random read, 60-second warmup, 60-second measurement
sudo fio --name=randread --ioengine=libaio --rw=randread \
--bs=4k --size=1G --numjobs=4 --iodepth=32 \
--runtime=60 --time_based --group_reporting
Random Write IOPS (4K)
Relevant for database write-ahead logs, session storage, and any application that writes frequently:
sudo fio --name=randwrite --ioengine=libaio --rw=randwrite \
--bs=4k --size=1G --numjobs=4 --iodepth=32 \
--runtime=60 --time_based --group_reporting \
--fallocate=0 --direct=1
Latency Distribution
Average IOPS can hide latency spikes. Use ioping to measure the worst-case latency distribution:
# 100 sequential requests, 4K size
sudo ioping -c 100 -s 4k /var/lib
# Run with -D for cached vs uncached comparison
sudo ioping -c 100 -D -s 4k /var/lib
Sequential Throughput
Relevant for large file transfers, backups, and media serving:
sudo fio --name=seqread --ioengine=libaio --rw=read \
--bs=1M --size=2G --numjobs=2 --iodepth=8 \
--runtime=30 --time_based --group_reporting
sudo fio --name=seqwrite --ioengine=libaio --rw=write \
--bs=1M --size=2G --numjobs=2 --iodepth=8 \
--runtime=30 --time_based --group_reporting \
--fallocate=0 --direct=1
Interpreting Results: What Good Looks Like
| Metric | Budget SATA SSD | Good NVMe | Excellent NVMe |
|---|---|---|---|
| 4K random read IOPS | 5,000–15,000 | 25,000–60,000 | 80,000+ |
| 4K random write IOPS | 3,000–10,000 | 15,000–40,000 | 50,000+ |
| 4K latency (avg) | 300–800 µs | 100–300 µs | <100 µs |
| 4K latency (p99) | >5 ms | 1–3 ms | <1 ms |
| Sequential read | 200–400 MB/s | 500–1500 MB/s | >2000 MB/s |
Key insight: If your 4K random read IOPS remain stable (within 20% variance) across three runs at different times, your provider’s storage pool is well-provisioned. If the numbers swing 50% or more, the host is over-subscribed and you will experience performance degradation during peak hours.
Workload-Specific Storage Requirements
Different workloads have different storage profiles. Here is what to prioritize for each:
Databases (MySQL, PostgreSQL, MariaDB)
Databases are the most sensitive to storage performance. A 4K random read IOPS number below 10,000 will cause visible query latency when the working set exceeds available RAM. The InnoDB buffer pool or PostgreSQL shared_buffers caches hot data, but any cache miss results in a 4K–16K random read. For database workloads, prioritize 4K random read IOPS over sequential throughput. Configure your database with innodb_flush_method=O_DIRECT (MySQL) or effective_io_concurrency=200 (PostgreSQL) to match the storage capability.
Web Servers (Nginx, Apache, Static Files)
Web servers are largely cache-friendly. Most static files are served from the kernel’s page cache, which operates at memory speed (nanoseconds, not microseconds). The storage layer only matters for the initial read after boot or cache flush. For web servers, RAM quantity matters more than storage speed. A 4 GB VPS with SATA SSD will outperform a 1 GB VPS with NVMe for the same web workload because more of the working set stays in page cache.
Build Servers and CI/CD Runners
Compilation involves reading thousands of small source files, writing intermediate objects, and linking. This is a mixed random read/write workload with high file count. NVMe’s higher IOPS and lower latency directly translate to faster build times. For a GitLab runner or Jenkins agent, the difference between SATA SSD and NVMe can be 30–50% faster build completion.
The Provider’s Role: Beyond the Spec Sheet
Three factors at the provider level determine your actual storage experience:
- Over-provisioning ratio. Providers that sell 200 NVMe VPS from a 1 TB physical NVMe array will have severe contention. Look for providers that publish IOPS guarantees or sustained throughput limits.
- I/O scheduling. CFS (Completely Fair Scheduler) or CFQ at the hypervisor level can introduce latency. Some providers use dedicated NVMe drives per host with no overselling.
- Backup isolation. If backup traffic shares the same storage pool, you will see periodic latency spikes during backup windows. Providers that route backup traffic through a separate network or storage tier are preferable.
When you compare VPS providers on our comparison table, look for sustained IOPS guarantees rather than burst numbers. A provider offering “up to 100,000 IOPS” with no sustained floor is less reliable than one guaranteeing 20,000 sustained IOPS.
Practical Recommendations
- For database workloads: Choose NVMe plans with at least 20,000 sustained 4K random read IOPS. Match the plan’s RAM to your database working set size.
- For web servers: Prioritize RAM over storage speed. A 4 GB plan with SATA SSD is often better than a 2 GB NVMe plan.
- For CI/CD: NVMe is worth the premium. Even budget NVMe will significantly outperform SATA SSD for build times.
- Always benchmark: Run the fio and ioping tests above on a trial instance before committing to a provider. If the provider won’t let you test before paying, that is itself a data point.
Run the benchmark suite on your current VPS, then check out the best VPS performance specs to see how different providers compare on storage, RAM, and CPU allocations. The right storage for your workload is the one that matches your specific IO pattern, not the one with the fastest marketing claim.



Leave a Reply
You must be logged in to post a comment.