用dd配合oflag=direct测磁盘真实写入能力,必须排除缓存、路径、块大小和系统干扰四变量;oflag=direct绕过页缓存直通块设备层,否则测的是内存速度而非磁盘性能。

要用 dd 配合 oflag=direct 测出磁盘最真实的物理写入能力,关键不是“加了 flag 就行”,而是整套操作必须排除缓存、路径、块大小和系统干扰这四个核心变量。
为什么 oflag=direct 是绕过缓存的硬性门槛
Linux 默认把写数据先塞进页缓存(page cache),dd 报出的速度其实是内存拷贝速度,可能高达几 GB/s,但和磁盘本身毫无关系。oflag=direct 强制内核跳过页缓存,让数据直通块设备层——这才是真正考验磁盘控制器、NAND 闪存或磁头寻道能力的路径。没它,测出来的数字基本没参考价值。
测试命令必须满足的三个前提条件
-
输出目标必须是真实物理盘上的文件:不能写到
/tmp(常为 tmpfs 内存盘)、不能写到未挂载的目录、也不能写到 NFS/FUSE 类文件系统(它们不支持 direct I/O);正确做法是写入已挂载的目标盘路径,例如/mnt/data/testfile -
文件大小要足够摊平瞬时抖动:太小(如 100MB)易受预热、元数据开销影响;太大(如 20GB)耗时且无必要;推荐写 2–4GB,对应
bs=1M count=2048或bs=1G count=4 -
避免其他后台 IO 干扰:测试前停掉日志服务(rsyslog)、数据库、备份任务等;可临时用
ionice -c3降低测试进程 IO 优先级,减少对系统的扰动
推荐的最小可靠写测试命令
以下命令兼顾通用性、真实性与可读性:
time dd if=/dev/zero of=/mnt/testfile bs=1M count=2048 oflag=direct status=progress
说明:
• if=/dev/zero 提供无限零流,无额外 IO 开销
• bs=1M 是 SSD 和 HDD 都较友好的块大小起点(NVMe 可试 bs=4M 或 bs=64M 看是否达峰值)
• count=2048 → 总写入 2GB,时间在几秒到十几秒之间,易于观察
• oflag=direct 是不可省略的核心标志
• status=progress 实时显示速率,比等结束再看更直观
读测试不能只写完就直接读
写完后立即读,很可能还在缓存里——必须主动清空:
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"<br>dd if=/mnt/testfile of=/dev/null bs=1M iflag=direct status=progress
注意:
• echo 3 清页缓存 + dentry + inode 缓存,需 root 权限
• iflag=direct 同样关键,否则读的是内存副本
• 若提示 Invalid argument,说明底层不支持 direct I/O(如某些加密卷或旧 FUSE),此时去掉该 flag,但结果要注明“含缓存影响”











