Ubuntu 服务器使用 dd 测试磁盘 IO 速度结果偏低,通常是因为测试命令未绕过系统缓存或云服务商限制了实例 IO 性能。建议先使用 oflag=direct 参数重测,若仍偏低则改用 fio 工具并结合云厂商文档核对实例规格限制。
先说结论:dd 默认测试的是缓存速度而非磁盘真实写入能力,结果偏低需排除缓存干扰和云厂商 throttling 限制。
- 先定位:确认 dd 命令是否添加 oflag=direct 参数,检查云控制台实例 IO 配额。
- 先做:使用 dd 直写模式复测,或部署 fio 工具进行标准化 IO 压测。
- 再验证:对比多次测试结果,通过 iostat 观察磁盘繁忙状态是否饱和。
命令速用版
以下命令可直接在 Ubuntu 终端执行,用于绕过缓存测试真实写入速度。
dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct conv=fdatasync
若需更精确的随机读写测试,建议使用 fio 工具:
fio -name=write_test -ioengine=libaio -iodepth=1 -rw=write -bs=4k -direct=1 -size=1G -numjobs=1 -runtime=60 -group_reporting
为什么会这样
dd 测试结果偏低的核心原因是 Linux 默认启用写缓存机制,且云服务器实例存在 IO 性能上限。
默认情况下,dd 写入的数据先存入内存 Page Cache,随后由内核异步刷入磁盘,此时测得的是内存写入速度而非磁盘 IO 速度。若添加了 oflag=direct 参数仍偏低,通常是因为云服务商(如 AWS、阿里云、腾讯云)根据实例规格限制了最大 IO 吞吐量或 IOPS。公开资料中没有看到可靠的量化数据表明所有实例的统一标准,具体限值需查阅对应云厂商文档。
分步处理
按以下顺序排查磁盘 IO 测试结果偏低问题,每步操作后需观察输出变化。
步骤 1:检查磁盘剩余空间
测试前确认目标分区有足够空间,避免磁盘写满导致速度下降。
df -h .
步骤 2:使用直写模式复测
添加 oflag=direct 强制绕过缓存,conv=fdatasync 确保数据落盘。
dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct conv=fdatasync
步骤 3:切换测试工具
dd 仅适合顺序写入测试,安装 fio 进行混合读写测试。
sudo apt update && sudo apt install fio -y
步骤 4:核对云厂商限制
登录云控制台查看实例规格详情页,核对基准性能与突发性能限制。
怎么验证是否生效
通过对比直写前后数据差异和系统负载状态来验证测试结果真实性。
检查点 1:速度数值变化
若添加 oflag=direct 后速度显著下降,说明之前测得的是缓存速度,当前结果更接近真实磁盘性能。
检查点 2:系统负载监控
测试期间新开终端运行 iostat,观察 %util 是否接近 100%。
iostat -x 1
检查点 3:清理测试文件
测试完成后删除生成的测试文件,避免占用生产空间。
rm -f ./testfile
常见坑
- 测试文件过大:dd count 参数设置过大会写满磁盘,导致文件系统性能急剧下降甚至服务不可用。
- 系统盘干扰:在系统根目录进行测试可能影响操作系统正常 IO 调度,建议在数据盘挂载点进行。
- 单次测试偶然性:磁盘 IO 受后台任务影响,建议至少执行 3 次测试取平均值。
- 忽略读取速度:写入速度偏低不代表读取速度同样偏低,业务场景需分别测试。
常见问题
dd 测试和 fio 测试结果为什么不一样?
dd 主要测试顺序写入,fio 可模拟随机读写且参数更精细,fio 结果通常更具参考价值。
磁盘 IO 低会影响网站访问速度吗?
若网站涉及大量数据库写入或日志记录,磁盘 IO 低会导致响应延迟增加,静态资源网站影响较小。
云服务器 IO 速度能突破实例规格限制吗?
不能,云厂商在hypervisor层做了限制,升级实例规格是提升 IO 上限的唯一可靠途径。
参考来源
- Linux man-pages, "dd - convert and copy a file", https://man7.org/linux/man-pages/man1/dd.1.html
- fio Documentation, "Flexible I/O Tester", https://github.com/axboe/fio