Home / News / Bare-Metal PCIe 4.0/5.0 NVMe vs Hyperscaler Provisioned IOPS: 2026 Database Storage Cost Breakdown
Storage Economics Dispatch

Bare-Metal PCIe 4.0/5.0 NVMe vs Hyperscaler Provisioned IOPS: 2026 Database Storage Cost Breakdown

How AWS EBS gp3 and io2 Block Express actually bill for IOPS (with a correctly tiered 100,000-IOPS example), what PCIe 4.0 and 5.0 NVMe change for PostgreSQL, MySQL and ClickHouse, how RAID-10 affects read and write IOPS, and a break-even worksheet plus fio commands to measure your own storage.

By FoxyData Infrastructure Team • Published October 30, 2026 • 9 min read
Bare-Metal PCIe 4.0/5.0 NVMe vs Hyperscaler Provisioned IOPS: 2026 Database Storage Cost Breakdown
Affiliate disclosure: This article includes partner boxes for a bare-metal server provider and a VPS host. If you order through them, FoxyData may earn a commission at no extra cost to you. We did not benchmark any provider for this piece: AWS figures are calculated from AWS’s published list prices, drive and array figures are clearly labelled examples, and the commands at the end let you produce real numbers on your own hardware.

1. Why storage is often the largest surprise on a database bill

On a hyperscaler, a database server’s disk is not just capacity. With network-attached block storage you pay separately for gigabytes, for IOPS and sometimes for throughput, and each of those has its own ceiling. On a bare-metal server with local NVMe drives, the drives come with the machine: you pay one monthly price, and the IOPS ceiling is set by the hardware rather than by a pricing tier.

That difference matters most for write-heavy OLTP databases (PostgreSQL, MySQL/MariaDB) and for analytical engines that scan a lot of data (ClickHouse, TimescaleDB). This guide walks through the AWS EBS cost model with correct arithmetic, explains what PCIe 4.0 and PCIe 5.0 NVMe actually change, and lists the trade-offs you take on when you leave managed block storage behind.

2. How AWS EBS charges for IOPS

The two volume types most databases end up on are gp3 (general purpose SSD) and io2 Block Express (provisioned IOPS SSD). The figures below are AWS’s published us-east-1 list prices; other regions cost more, and prices change, so check the Amazon EBS pricing page before you rely on them.

Amazon EBS gp3 and io2 pricing model (us-east-1 list prices; verify current rates)
Volume type Capacity Included performance Extra IOPS Good fit
gp3 $0.08 per GB-month 3,000 IOPS and 125 MB/s baseline, regardless of size $0.005 per provisioned IOPS-month above 3,000; extra throughput $0.04 per MB/s-month above 125 Most small and medium databases
io2 Block Express $0.125 per GB-month None; every IOPS is provisioned and billed Tiered: $0.065 up to 32,000; $0.0455 for 32,001–64,000; $0.032 above 64,000 (per IOPS-month) Large, I/O-heavy databases that need consistent high IOPS on one volume

Two points that are often misreported:

  • 3,000 IOPS is gp3’s baseline, not its cap. You can provision more IOPS on gp3 without switching to io2. gp3 was long limited to 16,000 IOPS per volume; AWS has since raised the per-volume limits, so check the current EBS volume-type documentation for today’s maximum.
  • The instance limits the volume too. Every EC2 instance type has its own maximum EBS IOPS and bandwidth. A large io2 volume attached to a small instance will not deliver its provisioned IOPS.

Worked example: 2,000 GB at 100,000 IOPS on io2

  • Capacity: 2,000 GB × $0.125 = $250.00
  • IOPS, first tier: 32,000 × $0.065 = $2,080.00
  • IOPS, second tier: 32,000 × $0.0455 = $1,456.00
  • IOPS, third tier: 36,000 × $0.032 = $1,152.00
  • Total: about $4,938 per month for the volume alone, before the EC2 instance, snapshots, backups or data transfer.

That works out to roughly $0.049 per provisioned IOPS per month on average. For comparison, the same 2,000 GB on gp3 provisioned to 16,000 IOPS costs 2,000 × $0.08 = $160 plus 13,000 × $0.005 = $65, or about $225 per month. gp3 is cheap per IOPS; io2 becomes expensive quickly once you need tens of thousands of IOPS on a single volume.

Internet egress is a separate line item. AWS’s standard rate for data transfer out to the internet in us-east-1 starts at $0.09 per GB after a small free allowance, which adds up for replicas, backups or analytics exports leaving the cloud.

3. What local NVMe changes

An NVMe drive in a bare-metal server talks to the CPU directly over PCIe, using many parallel submission and completion queues. There is no storage network between the database and its data, and there is no per-IOPS meter.

Raw PCIe bandwidth per NVMe drive (x4 link, per direction)
Interface Transfer rate per lane x4 raw bandwidth What it means for databases
PCIe 4.0 x4 16 GT/s ≈ 64 Gbit/s, about 7.9 GB/s Enough for nearly all OLTP workloads; random IOPS, not link bandwidth, is usually the limit
PCIe 5.0 x4 32 GT/s ≈ 128 Gbit/s, about 15.8 GB/s Helps large sequential scans, backups, restores and analytics; less difference for small random writes

Vendor datasheets for current enterprise PCIe 4.0 U.2/U.3 drives typically quote random 4K read performance in the high hundreds of thousands of IOPS, and PCIe 5.0 models go higher still. Random write figures are always lower, and datasheets quote them at high queue depth on a drive in steady state. A database committing transactions one at a time will see far fewer IOPS than the headline number, so test with a workload shaped like yours (see Section 6).

How RAID-10 changes the numbers

RAID-10 mirrors pairs of drives and stripes across the pairs. Every write lands on two drives, so writes cost double; reads can be served by either copy. A simple model:

  • Array read IOPS ≈ number of drives × per-drive read IOPS
  • Array write IOPS ≈ number of drives × per-drive write IOPS ÷ 2
  • Usable capacity = half the raw capacity

Illustrative example (not a measurement): four drives, each rated by its maker at 150,000 random write IOPS, give about 4 × 150,000 ÷ 2 = 300,000 write IOPS in theory, and four 3.84 TB drives give about 7.68 TB usable. In practice the CPU, the Linux md layer, the filesystem and the database itself will cap you well before the theoretical figure. The same model also shows why a RAID-10 array should never report more write IOPS than read IOPS: if a provider’s spec sheet shows that, ask how it was measured.

4. Bare metal, VPS and managed block storage compared

  • Bare-metal server with local NVMe: single tenant, full drive performance, flat monthly price. You own RAID, backups, replication and failover.
  • NVMe VPS or VDS: the drives are local to the host, but the host is shared and virtualized. Providers set I/O limits per plan and neighbours can affect you. Good value for small databases, staging and read replicas; do not assume dedicated-drive performance.
  • EBS gp3 / io2: network-attached, replicated within an Availability Zone by AWS, resizable online and snapshot-friendly. You pay for that convenience per GB and per IOPS.

5. A break-even worksheet you can fill in

Because server prices change and depend heavily on configuration, we are not quoting provider prices here. Instead, compare like for like:

  1. Cloud side: EC2 instance price + EBS capacity + provisioned IOPS (use the tiers above) + snapshots + expected egress.
  2. Bare-metal side: monthly server price with the drives you need + off-site backup storage + any extra bandwidth beyond the plan’s allowance + the engineering time to run replication and restores.
  3. Normalise: divide each total by the IOPS you actually need at your target queue depth, not by the datasheet maximum.

Using the worked example above: if your workload genuinely needs 100,000 IOPS on one volume, the io2 line alone is about $4,938 per month. Ask the bare-metal provider for a quote on a server with four enterprise NVMe drives and put both totals side by side. If you only need 10,000–16,000 IOPS, gp3 at about $225 per month for 2,000 GB is hard to beat, and moving to bare metal is mainly about compute cost or egress, not storage.

6. Commands to measure your own storage

These commands are safe to run against a test file on a mounted filesystem. The mdadm --create line erases the listed drives; only run it on a fresh server.

# 1. Check NVMe link speed and width (16.0 GT/s = PCIe 4.0, 32.0 GT/s = PCIe 5.0)
sudo nvme list
cat /sys/class/nvme/nvme0/device/current_link_speed
cat /sys/class/nvme/nvme0/device/current_link_width

# 2. Confirm the I/O scheduler (NVMe normally uses "none")
cat /sys/block/nvme0n1/queue/scheduler

# 3. DESTRUCTIVE: build a 4-drive RAID-10 array on empty drives
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 \
  /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1

# 4. Mixed 70/30 random read/write at 4K, run against a test file
sudo mkdir -p /srv/fio-test
sudo fio --name=oltp-mix --filename=/srv/fio-test/testfile --size=20G \
  --direct=1 --ioengine=io_uring --rw=randrw --rwmixread=70 --bs=4k \
  --iodepth=32 --numjobs=4 --time_based --runtime=120 --group_reporting

# 5. Commit-path test: small sequential writes, each followed by fdatasync
sudo fio --name=wal-sync --filename=/srv/fio-test/walfile --size=1G \
  --ioengine=psync --rw=write --bs=8k --fdatasync=1 --numjobs=1 \
  --time_based --runtime=60

# 6. Drive health and wear
sudo nvme smart-log /dev/nvme0 | grep -E 'temperature|percentage_used|media_errors'

Test 4 shows how much parallel random I/O the array sustains. Test 5 is closer to what a database does on every commit, and it is usually the more honest predictor of transaction throughput. PostgreSQL users can cross-check with pg_test_fsync, which ships with PostgreSQL.

Trade-offs of leaving managed block storage

  • Durability is your job. EBS keeps copies inside an Availability Zone for you. Local NVMe RAID-10 protects against a drive failure, not against losing the whole server, so you need streaming replication to a second machine and tested off-site backups (pgBackRest, WAL-G, Percona XtraBackup).
  • No online resize or instant snapshots. Growing capacity means adding drives or migrating, and point-in-time recovery depends on the backup tooling you set up.
  • Provisioning takes longer. A bare-metal server is installed and imaged on real hardware, which takes longer than attaching a new cloud volume.
  • Datasheet IOPS are optimistic. Vendor figures come from high queue depths on drives in steady state. Measure with your own access pattern before sizing.

7. Verdict

  • Stay on gp3 if your database needs under about 16,000 IOPS and you value snapshots and managed durability. Provision extra IOPS on gp3 before you reach for io2.
  • Price out bare metal once you are paying for tens of thousands of provisioned io2 IOPS, or when egress and instance costs dominate. A single-tenant server with local NVMe in RAID-10, plus a replica, often changes the cost picture completely, but only if your team can run backups and failover.
  • Use an NVMe VPS for small production databases, staging and replicas where a modest monthly price matters more than guaranteed dedicated-drive performance.

Single-tenant bare-metal servers with local NVMe

Verified technical partner. Direct secure access.

Configure a Cherry Servers bare-metal server →

NVMe VPS for smaller databases and replicas

UltaHost offers NVMe-based VPS plans with root access. These are virtualized and shared, so I/O limits depend on the plan; they suit small production databases, staging and read replicas better than heavy OLTP. Check the plan's resources and run the fio tests above after provisioning.

See UltaHost NVMe VPS plans →
Disclosure: FoxyData may earn a commission via partner links at no additional cost to you.