什么是 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 双重确认目标。