真实写入速度需用dd加oflag=direct绕过缓存,并指定真实挂载点、bs=1M、count=2048及conv=fdatasync确保落盘,再清缓存、控干扰、取多次中间值。

要测出磁盘真实写入速度,关键不是“用dd”,而是让dd把数据真正落到盘上——否则你看到的可能是内存带宽,不是硬盘能力。
必须加 oflag=direct 绕过系统缓存
默认情况下,dd 把数据写进 page cache 就返回,内核在后台慢慢刷盘。这导致测出来 1.5 GB/s 可能只是 DRAM 吞吐,而磁盘实际只有 300 MB/s。加上 oflag=direct 后,数据跳过缓存直通驱动层,强制走物理路径。
- 不能写到 /tmp(常为 tmpfs 内存文件系统),必须指定目标磁盘的真实挂载点,比如
/mnt/data对应/dev/sdb1 - 块大小建议用
bs=1M:太小(如 4K)放大元数据开销,太大(如 64M)可能触发 RAID 卡异常 -
count=2048表示写 2GB,足够摊平预热抖动,又不会跑太久
必须选一个同步机制确保落盘完成
仅加 direct 还不够——它只绕缓存,不保证写操作结束时数据已进磁盘介质。尤其 SSD 或 RAID 卡自带写缓存,数据可能还卡在设备缓存里。这时需补充同步控制:
- conv=fdatasync:整个写完后调一次 fdatasync(),强制本次 dd 写的数据刷到底层设备。最常用,也最贴近多数应用的真实行为
- oflag=dsync:每次写一块都同步,更严格但更慢,适合模拟高可靠性场景(如数据库日志写入)
- 别用
; sync放在命令后面——sync 是独立命令,dd 早就结束了,起不到作用
测试前中后要控变量
同一块盘三次测试结果差一倍?大概率是环境没控住:
- 测试前执行
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"清空页缓存、目录项和 inode 缓存 - 关闭干扰 IO 的进程:日志轮转、监控采集、定时备份等
- 单次结果偶然性大,至少跑 3 次,取中间值,别信第一次
- 测完删掉测试文件,避免占空间或影响下次测试:
rm -f /mnt/data/testfile
一条可直接运行的靠谱命令
综合以上要点,推荐这条命令:
time dd if=/dev/zero of=/mnt/data/testfile bs=1M count=2048 oflag=direct conv=fdatasync
它写 2GB 数据,绕缓存,且确保全部落盘后才计时结束。输出末尾的 real 时间换算后就是真实写速(例如 real 6.8s → ≈ 300 MB/s)。结果比 hdparm -t 低是正常的——dd 测的是「应用→文件系统→驱动→磁盘」全链路,hdparm 测的是裸设备读,路径不同,数值本就不该一致。


















