读完这篇能帮助你拿到三样东西:一套可直接复制的 fio 测试命令、4K 随机读写与延迟分布的基准数据样例,以及把 IOPS 和 P99 延迟映射到数据库、日志和容器业务的方法。很多人买 VPS(虚拟专用服务器)只看 CPU 和带宽(网络传输容量),真正决定数据库、日志和容器业务流畅度的往往是磁盘 I/O。本文用 fio(一个可配置的磁盘基准测试工具)对 VPS 做随机读写、吞吐和延迟分布测试,重点不是刷出一个最高分,而是看磁盘在持续压力下的延迟分布会不会拖垮业务。
测试覆盖 4K 随机读写、顺序读写和混合负载,并记录 P95、P99 延迟。如果你正在选型,可以参考 香港服务器选择的 6 个核心指标里的磁盘 I/O 维度,把基准数据和业务场景对齐,避免只看商家标称的“SSD 高速盘”就下单。
一、为什么不能只看 dd 测出的吞吐
很多人用一条 dd if=/dev/zero of=test.img bs=1M 测出几百 MB/s 就认为磁盘很快。dd 测的是顺序大块写入,反映的是缓存命中后的吞吐峰值,不代表数据库那种小块随机读写场景。数据库、日志切割、容器镜像层更新更多是 4K-16K 的随机 I/O,此时磁盘的真实能力要看 IOPS(每秒输入输出次数)和延迟分布。
更靠谱的做法是用 fio 模拟真实负载。fio 可以指定块大小、读写比例、队列深度和并发数,输出 IOPS、吞吐、平均延迟和分位延迟。下面测试在一台标称 NVMe SSD 的 VPS 上进行,系统为 Linux,文件系统 ext4。
二、4K 随机读写测试:数据库最关心的指标
4K 随机读写最能反映数据库和容器层的真实压力。先用 fio 跑随机读,记录 IOPS 和延迟分布。
fio --name=randread --filename=/tmp/fio_randread --rw=randread --bs=4k --size=1G --runtime=60 --time_based --iodepth=32 --direct=1 --group_reporting --percentile_list=50:95:99:99.9
测试结果:这台 VPS 随机读 IOPS 约 38000,平均延迟 0.84ms,P95 延迟 1.2ms,P99 延迟 2.1ms。P99 延迟比平均值高 2.5 倍,说明存在尾部延迟毛刺。对单条数据库查询可能只多花 1ms,但在高并发下尾部延迟会叠加成明显的响应抖动。
再测随机写,写场景更能暴露超卖和缓存回写问题。
fio --name=randwrite --filename=/tmp/fio_randwrite --rw=randwrite --bs=4k --size=1G --runtime=60 --time_based --iodepth=32 --direct=1 --group_reporting
随机写 IOPS 约 12000,明显低于读。这个差距很正常,但如果随机写 IOPS 跌到 2000 以下,就要怀疑是不是被限制到旋转盘或后端存储超卖。写延迟如果出现周期性飙升(每隔几秒一次尖峰),通常是后端存储在做缓存回写或空间回收。

三、顺序读写与混合负载
顺序读写反映日志写入、备份和大文件传输场景。块大小设为 1M,更接近真实大文件负载。
fio --name=seqwrite --filename=/tmp/fio_seq --rw=write --bs=1M --size=4G --runtime=60 --time_based --iodepth=8 --direct=1 --group_reporting fio --name=mixed --filename=/tmp/fio_mix --rw=randrw --rwmixread=70 --bs=4k --size=1G --runtime=60 --time_based --iodepth=16 --direct=1 --group_reporting
顺序写吞吐约 520MB/s,混合读写(70% 读)IOPS 约 24000。混合负载下总 IOPS 低于纯随机读,因为读写切换会增加请求开销。如果你的业务是读写混合型(比如带缓存的数据库),应该用混合测试而不是只看纯读峰值。
| 测试场景 | IOPS / 吞吐 | 平均延迟 | P99 延迟 | 业务关联 |
|---|---|---|---|---|
| 4K 随机读 | 38000 IOPS | 0.84ms | 2.1ms | 数据库查询、缓存读取 |
| 4K 随机写 | 12000 IOPS | 2.6ms | 6.4ms | 数据库写入、日志追加 |
| 1M 顺序写 | 520MB/s | 15ms | 28ms | 备份、日志归档 |
| 4K 混合 70/30 | 24000 IOPS | 1.1ms | 3.8ms | 带缓存的读写业务 |
四、延迟分布比平均值更重要
很多人只看 fio 报告里的平均延迟,但平均值会掩盖尾部毛刺。一台 VPS 平均延迟 1ms 但 P99 是 8ms,另一台平均 1.5ms 但 P99 是 2ms,后者在真实业务里更稳定。数据库连接池、API 超时通常按百分位设置,P99 飙升会直接触发超时和重试。
建议测试时用 --percentile_list=50:95:99:99.9 输出完整分位。如果 P99.9 远高于 P99(比如 P99 是 3ms 但 P99.9 是 30ms),说明存在偶发严重毛刺,可能来自邻居噪声、后端存储抖动或网络存储链路。这类毛刺在短时间测试里容易被漏掉,所以 fio 至少跑 60 秒,最好跑 5 分钟看是否稳定。

五、把基准数据映射到业务场景
测试数据本身只是参考,关键是对应业务。如果 VPS 跑 MySQL(一种关系型数据库),4K 随机写 IOPS 低于 5000 时,高并发写入会出现锁等待和慢查询;如果跑日志收集服务,顺序写吞吐低于 100MB/s 时,日志堆积会挤占磁盘。容器场景下,镜像层更新和 volume 读写都是随机 I/O,IOPS 过低会让容器启停明显变慢。
选型时要把基准数据和预期并发量对齐。比如业务高峰预计 8000 IOPS 随机写,那 VPS 实测至少要有 1.5 倍余量,也就是 12000 IOPS 以上,否则高峰期延迟会迅速恶化。磁盘性能也会影响迁移窗口:如果做 WordPress 网站迁移时目标机磁盘 I/O 不足,导入数据库和大文件阶段会被拉长,迁移窗口风险更高。如果服务器面向国内访客,还要把磁盘性能和线路表现分开看,可以参考 美国服务器跨境访问实测的思路:网络延迟和磁盘 I/O 是两类独立指标,不要混在一起判断。Hostease 这类面向中文用户的 VPS 服务,磁盘性能差异会直接影响 WordPress、数据库和容器业务的响应速度,下单前最好用 fio 验证一次实际表现。
六、测试时的注意事项
第一,用 --direct=1 绕过操作系统页缓存,否则测的是内存不是磁盘。第二,测试文件不要放在 /dev/shm 或 tmpfs 上,那是内存文件系统。第三,测试后清理临时文件,避免占用磁盘。第四,多次测试取稳定值,单次结果可能受瞬时负载影响。
rm -f /tmp/fio_randread /tmp/fio_randwrite /tmp/fio_seq /tmp/fio_mix
第五,测试会加重磁盘负载,不要在生产服务器业务高峰期跑长时间 fio。建议在维护窗口或新机器开机后立即测试,把基准数据记入交付清单。
总结:用延迟分布而不是峰值判断磁盘够不够用
VPS 磁盘性能评测的核心不是刷最高 IOPS,而是看持续压力下的延迟分布是否稳定。建议用 fio 跑 4K 随机读写、顺序写和混合负载,至少 60 秒,重点记录 P95 和 P99 延迟。把基准数据乘以 1.5 倍余量再和业务预期并发对齐,比只看商家标称的“SSD”更可靠。延迟分布平稳的 VPS,即使平均 IOPS 不是最高,在真实数据库和容器业务里也往往更稳。



