磁盘 I/O 性能是 VPS 整体性能的重要组成部分,直接影响数据库读写速度、日志写入效率和文件传输体验。在搬瓦工 VPS 上,了解磁盘真实性能有助于合理选择套餐和调整应用配置。本文介绍用 dd 和 fio 两种工具进行磁盘 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/testfiledd 结果的局限性
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 p99 | 99 百分位延迟 | 反映偶发卡顿情况 |
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=direct 或 iflag=direct 测真实磁盘速度。
fio 测试显示 IOPS 很低,是磁盘坏了吗?
不一定。随机小块 IOPS 受 I/O 队列深度、并发数、磁盘类型影响很大。VPS 环境下受共享 I/O 限制,IOPS 偏低属正常,与独立服务器有差距。
怎么实时监控磁盘 I/O?
用 iostat -x 1 查看实时磁盘读写速度和利用率;iotop 可以查看哪个进程在大量读写磁盘,类似 top 的体验。