dd命令可快速测试磁盘顺序读写速度,但必须用oflag=direct绕过页缓存测写入、用echo 3 > /proc/sys/vm/drop_caches清缓存后再用iflag=direct测读取,配合合理bs和count参数,并多次测试取中间值;其结果仅反映大块顺序i/o能力,无法体现4k随机读写、iops、延迟及多线程并发性能。

dd 命令可以快速测出磁盘的顺序读写速度,但必须绕过缓存、清空缓存,并合理设置参数,否则结果会严重失真。
测写入速度:绕过页缓存直写磁盘
关键是要让数据真正落到物理盘上,而不是只写进内存缓存:
-
用
oflag=direct跳过内核页缓存,强制直写设备 -
输入源选
/dev/zero,它不产生真实 I/O,所有负载都落在目标磁盘写入上 -
块大小建议用
bs=1G或bs=64M,减少系统调用开销,更适合测连续带宽 -
写总量建议 ≥ 4GB(如
count=4配bs=1G),太小易受瞬时波动影响 - 目标路径(
of=)必须是待测磁盘的真实挂载点,比如/mnt/data/testfile,且空间充足
示例命令:dd if=/dev/zero of=/mnt/data/testfile bs=1G count=4 oflag=direct
测读取速度:先清缓存再绕缓存读
否则很可能读到内存里的副本,测出来的是内存速度而非磁盘速度:
-
执行
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"清空页缓存、目录项和 inode 缓存(需 root 权限) -
加
iflag=direct强制从磁盘读,避免缓存干扰 - 读取文件必须是之前写入的同一文件,确保测试对象一致
- 若提示
Invalid argument,说明文件系统不支持 direct I/O(如某些 FUSE 类型),可临时去掉该 flag,但需明白结果含缓存成分
示例命令:
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"<br> dd if=/mnt/data/testfile of=/dev/null bs=1G iflag=direct
提升结果可信度的操作习惯
单次 dd 波动大,不能只看一次输出:
-
重复执行 3~5 次写测试,记录每次末尾显示的速率(如
1.3 GB/s),取中间值更稳 - 测试期间关闭无关服务,暂停备份、日志轮转、监控采集等可能干扰磁盘的进程
-
对 NVMe 或高性能 SSD,可尝试不同
bs(如4M、64M),有些设备在特定块大小下吞吐峰值更高 -
未用
oflag=direct时,记得加sync确保写缓存刷盘后再看 dd 输出
注意它的能力边界
dd 只反映大块顺序 I/O 表现,不是全盘性能报告:
- 测不出 4K 随机读写性能(数据库、虚拟机典型负载),得用
fio或hdparm -tT - 无法体现 IOPS 和延迟,这对响应敏感型应用(如在线交易)很关键
- 默认单线程,压不出多队列 SSD 的并发能力
- 结果已包含文件系统开销(如 ext4 日志、XFS 分配策略),不是裸设备速度











