Performance Overview
| Metric | SATA SSD (Samsung 860 EVO) | NVMe SSD (Samsung 980 PRO) |
|---|---|---|
| Sequential Read (GB/s) | 550 MB/s | 2,000 MB/s |
| Sequential Write (GB/s) | 520 MB/s | 1,900 MB/s |
| Random 4KB Read IOPS | 90,000 | 1,200,000 |
| Random 4KB Write IOPS | 80,000 | 1,100,000 |
| Average Latency (µs) | 200 µs | 30 µs |
fio benchmark suite on a modern 5.15 kernel across identical compute hardware.
Impact on MySQL InnoDB Workloads
innodb_io_capacity– the number of I/O operations per second the background flushing engine targets.innodb_io_capacity_max– the upper threshold during sudden write bursts or buffer pool flushes.innodb_read_io_threads/innodb_write_io_threads– thread pools that scale with parallel storage channels.
Sample MySQL Configuration
[mysqld]
innodb_io_capacity=2000
innodb_io_capacity_max=4000
innodb_read_io_threads=8
innodb_write_io_threads=8innodb_io_capacity above 1000 frequently saturates the single hardware command queue (AHCI 32 commands). NVMe natively supports up to 64,000 queues with 64,000 commands each, easily handling sustained burst flushing.
Kernel Tuning Directives
# /etc/sysctl.d/99-iops.conf
vm.swappiness=10
vm.dirty_ratio=10
vm.dirty_background_ratio=5Practical Recommendations
- Place MySQL Data on NVMe: Keep
ibdata1, redo logs, and individual tablespaces on high-speed NVMe arrays. - Store Static Media on SATA / Object Storage: Retain static assets and archives on cheaper high-capacity storage tiers.
- Monitor Queue Latency: Utilize
iostat -xz 1to track%utilandawaittimes during peak traffic periods.
