磁盘 I/O 性能是 VPS 整体性能的重要组成部分,直接影响数据库读写速度、日志写入效率和文件传输体验。在搬瓦工 VPS 上,了解磁盘真实性能有助于合理选择套餐和调整应用配置。本文介绍用 ddfio 两种工具进行磁盘 I/O 测试的方法,并解读测试结果、给出优化建议。

本文要点

  • dd 测试:简单快速,适合初步了解顺序读写性能
  • fio 测试:专业全面,可模拟随机读写等真实场景
  • 测试结果受系统负载、缓存影响,需多次测量取平均
  • 优化方向:I/O 调度器、数据库缓存、日志写入策略

测试前的准备

  • 确保测试时服务器处于低负载状态,避免其他任务干扰结果
  • 测试文件应足够大(≥ 2 倍内存大小),以绕过操作系统的页面缓存
  • 记录多次测试结果取平均,单次结果参考价值有限
  • 测试完毕后删除测试文件,避免浪费磁盘空间

使用 dd 测试顺序读写

dd 是 Linux 内置的数据复制工具,虽然简陋,但快速了解顺序 I/O 足够用:

# 测试顺序写入速度(写 2GB 数据)
dd if=/dev/zero of=/tmp/testfile bs=1M count=2048 oflag=direct status=progress
# oflag=direct 跳过缓存,得到真实磁盘写入速度

# 测试顺序读取速度
dd if=/tmp/testfile of=/dev/null bs=1M iflag=direct status=progress

# 清理测试文件
rm /tmp/testfile

dd 结果的局限性

dd 只能测试顺序读写,而数据库、邮件等应用大量依赖随机 I/O。如果你的业务对随机 I/O 敏感(如 MySQL),应使用 fio 进行更全面的测试。

使用 fio 进行专业测试

fio 是专业的 I/O 基准测试工具,支持随机读写、混合负载等多种场景:

# 安装 fio
apt install -y fio   # Debian/Ubuntu
yum install -y fio   # CentOS/AlmaLinux

# 测试随机 4KB 读取(模拟数据库读场景)
fio --name=rand-read --ioengine=libaio --rw=randread \
    --bs=4k --numjobs=4 --iodepth=32 --size=1G \
    --runtime=30 --time_based --filename=/tmp/fio_test \
    --direct=1 --group_reporting

# 测试随机 4KB 写入
fio --name=rand-write --ioengine=libaio --rw=randwrite \
    --bs=4k --numjobs=4 --iodepth=32 --size=1G \
    --runtime=30 --time_based --filename=/tmp/fio_test \
    --direct=1 --group_reporting

# 测试顺序 128KB 读写(模拟大文件传输)
fio --name=seq-rw --ioengine=libaio --rw=rw \
    --bs=128k --numjobs=2 --iodepth=16 --size=2G \
    --runtime=30 --time_based --filename=/tmp/fio_test \
    --direct=1 --group_reporting

# 清理
rm /tmp/fio_test

解读测试结果

fio 输出包含多个指标,重点关注以下几项:

指标含义搬瓦工 SSD 参考值
IOPS每秒 I/O 操作数随机 4K 读:1000~50000+
BW(带宽)吞吐量 MB/s顺序读:200~500+ MB/s
lat(延迟)单次操作延迟4K 随机读:0.1~10 ms
clat p9999 百分位延迟反映偶发卡顿情况

VPS 与独立服务器的差异

搬瓦工使用共享物理主机,磁盘性能受同机其他用户负载影响,高峰期测试结果可能偏低。建议在不同时间段多次测试,以得到更具代表性的结论。

I/O 性能优化建议

选择合适的 I/O 调度器

# 查看当前调度器
cat /sys/block/vda/queue/scheduler
# 对 SSD(NVMe)推荐使用 none 或 mq-deadline
echo mq-deadline > /sys/block/vda/queue/scheduler

数据库层面优化

  • MySQL:增大 innodb_buffer_pool_size,减少磁盘读取
  • Redis:根据业务选择 AOF 持久化策略,减少同步写入频率
  • 日志:使用异步写入,避免日志 I/O 阻塞主业务

文件系统层面

  • ext4 挂载添加 noatime 选项,减少访问时间更新的写入
  • 定期运行 fstrim(SSD),保持 SSD 性能

小结

  • dd 快速了解顺序 I/O;fio 全面测试随机与混合负载
  • 测试要跳过缓存(oflag=direct / --direct=1),结果才真实
  • 优化优先级:数据库缓存 > I/O 调度器 > 文件系统挂载参数
  • 长期磁盘 I/O 偏高,用 iostat -x 1 定位瓶颈进程

常见问题

dd 测试结果显示 1 GB/s 以上,是真实值吗?

大概率是命中了页面缓存。没有加 oflag=direct 时,数据写入系统缓存就算完成,速度虚高。务必加 oflag=directiflag=direct 测真实磁盘速度。

fio 测试显示 IOPS 很低,是磁盘坏了吗?

不一定。随机小块 IOPS 受 I/O 队列深度、并发数、磁盘类型影响很大。VPS 环境下受共享 I/O 限制,IOPS 偏低属正常,与独立服务器有差距。

怎么实时监控磁盘 I/O?

iostat -x 1 查看实时磁盘读写速度和利用率;iotop 可以查看哪个进程在大量读写磁盘,类似 top 的体验。