要测磁盘真实写入速度,必须加oflag=direct绕过页缓存,否则测的是内存吞吐而非磁盘性能;推荐命令:time dd if=/dev/zero of=/mnt/data/testfile bs=1m count=2048 oflag=direct。

要测出磁盘真实的写入速度,关键不是“能不能跑起来”,而是“数据到底落没落到盘上”。不加 oflag=direct 的 dd 命令,测的其实是内存缓存(page cache)的吞吐,不是硬盘本身——你看到 2GB/s,硬盘可能实际只有 300MB/s。
必须加 oflag=direct 才算真实写速
这是硬性要求。否则内核一收到写请求就立刻返回“完成”,而数据还卡在内存里,dd 已经计时结束了。
-
正确写法:
time dd if=/dev/zero of=/mnt/data/testfile bs=1M count=2048 oflag=direct -
/mnt/data/ 必须是目标磁盘的真实挂载点(比如对应
/dev/sdb1),不能是/tmp(常为内存文件系统 tmpfs) - bs=1M 是较稳妥的块大小:太小(如 4K)会放大元数据和调度开销;太大(如 64M)可能触发 RAID 卡异常
- count=2048 → 写 2GB,足够摊平预热抖动,又不会耗时太久
- 别加
conv=notrunc或seek,否则引入寻址时间,不再是纯顺序写
想测“真正落盘”的速度?再加 fdatasync 或 sync
很多 SSD 和 RAID 卡自带写缓存,oflag=direct 跳过了系统缓存,但没绕过设备缓存。若要强制刷到物理介质:
- 用
conv=fdatasync(推荐)或oflag=sync - 命令示例:
time dd if=/dev/zero of=/mnt/data/testfile bs=1M count=2048 oflag=direct conv=fdatasync - 注意:速率会明显下降,但这个数字才是应用层能依赖的“稳态落盘速度”
避免结果虚高或波动大的操作
同一块盘三次测试结果差一倍?大概率不是硬件问题,是变量没控住:
- 测试前清缓存:
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" - 单次测试偶然性强,至少跑 3 次,取中间值(不是平均值)
- 关掉日志轮转、备份任务、监控采集等后台 IO 干扰
- 确认挂载选项合理,比如 ext4 启用
noatime,XFS 避免 log 开销过大
dd 测的是什么?别拿它当万能指标
dd 只反映单线程、大块、顺序写的路径性能(应用层→文件系统→驱动→磁盘)。它和 hdparm -t 数值不同完全正常:
-
hdparm -t /dev/sdb测裸设备物理读带宽(绕过文件系统) - dd 测的是全链路顺序写能力,更贴近实际业务场景(如大文件备份)
- 但对数据库、虚拟机这类小 IO、随机读写负载毫无参考价值——那得用
fio











