首页/系统/Linux 内核与性能调优速查/dd 快速顺序读写测试

dd 快速顺序读写测试

用 dd 做顺序写/读基准:of 指定目标、oflag/iflag=direct 绕缓存、conv=fsync 强制落盘;看最终 MB/s 估算吞吐。

什么是 dd 顺序读写测试

dd 是最容易上手的块设备吞吐测试工具:把零或随机数据按固定块大小写入目标路径,再读回来,通过最终报告的速率粗估设备顺序读写能力。要得到真实设备数据必须用 oflag=direct/iflag=direct 绕过页缓存,用 conv=fsync 确保数据真正落盘。它只适合顺序吞吐的量级评估,测不出 IOPS、并发性能与尾延迟,正式基准应交给 fio。

基本信息

绕缓存oflag=direct(写)/ iflag=direct(读)
强制落盘conv=fsync
进度显示status=progress
参数含义bs 每块大小,count 块数,总写入量 = bs × count
产出命令末尾的 MB/s 与总耗时

典型使用场景

  • 新盘或新存储卷上线前的顺序吞吐验收
  • 怀疑存储性能不达标时做一次量级验证,与厂商标称值对比
  • 云盘规格核对:确认实际吞吐与购买的 IOPS/带宽档位是否匹配
  • 变更前后对比:调整文件系统或挂载选项后的粗测
  • 临时生成大文件用于测试与演练:先用 dd 造数据再跑业务压测

写与读

写与读
# 顺序写:4GiB,绕过页缓存,显示进度
dd if=/dev/zero of=/data/testfile bs=1M count=4096 oflag=direct status=progress
# 落盘并计时(约 4GiB,可按需缩小规模)
dd if=/dev/zero of=/data/testfile bs=1M count=4096 conv=fsync oflag=direct
# 顺序读:同样绕过缓存
dd if=/data/testfile of=/dev/null bs=1M iflag=direct status=progress
ls -lh /data/testfile                       # 确认文件大小符合预期
rm -f /data/testfile                        # 测完清理,避免占满空间

参数与常见误用

写法效果常见问题
不加 direct数据先进页缓存,速率虚高结论夸大,与实际业务不符
bs=64k 小步长偏重 IOPS 表现测出的吞吐偏低,不代表顺序能力
bs=1M 大块贴近顺序吞吐评估不能反映小 IO 场景
只写不 fsync可能还没落盘就返回断电场景的耐久性无从判断
dd 的默认输出速率基于 wall clock 计算,包含进程启动与文件创建开销;测试量太小时误差比例大,建议单次至少几百 MiB 到几 GiB。
of= 一定要指向明确的测试文件或空盘:写错设备路径会直接覆盖数据,执行前用 lsblk 与 df 双重确认目标。

易错点

  • 不绕过缓存的结果虚高,评估真实设备性能必须加 direct,同时用 conv=fsync 确认落盘
  • dd 单流测不出 IOPS 与尾延迟,正式基准请用 fio,避免用单次 dd 结论给存储下判定
  • 测试文件留在生产盘上:几 GiB 的 testfile 忘删会挤占可用空间,甚至触发空间告警
  • of= 指向设备节点属于破坏性操作,路径必须先用 lsblk 核实,绝不能凭记忆填写

数据来源与参考

  • coreutils 文档 dd(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌