dd命令仅能测出磁盘大块顺序I/O极限吞吐,不代表真实业务性能;测写需oflag=direct绕缓存,测读前须echo 3 > /proc/sys/vm/drop_caches清缓存,结果应多次测试取中间值。

dd 命令能快速测出磁盘分区在大块顺序 I/O 下的极限吞吐,但结果不代表真实业务性能——它不反映随机读写、IOPS 或延迟。关键在于绕过缓存、控制变量、多次验证。
测写入速度:绕开内存缓存才真实
使用 oflag=direct 强制直写磁盘,避免 page cache 干扰:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- dd if=/dev/zero of=/mnt/testfile bs=1M count=2048 oflag=direct —— 写 2GB 零数据,块大小 1MB,适合多数 SATA/NVMe 设备
- 目标路径 /mnt/testfile 必须落在待测分区(如 /dev/sdb1 挂载在 /mnt),且空间充足
- 若想更严格刷盘(禁用设备级写缓存),加 conv=fdatasync,但速度会明显下降,适合验证数据持久性
测读取速度:先清缓存再读
读之前必须清空内核页缓存,否则可能读到内存副本:
- 执行 sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" —— 清页缓存、dentry 和 inode 缓存
- 再运行 dd if=/mnt/testfile of=/dev/null bs=1M iflag=direct
- 如果提示 Invalid argument,说明文件系统不支持 direct I/O(如某些 FUSE 类型),可去掉 iflag=direct,但需明白结果含缓存影响
提升结果可信度的操作要点
- 单次测试波动大,建议重复 3 次,取中间值(非平均值)作为最终结果
- 避免测试时有其他 I/O 干扰:关闭日志轮转、备份任务、监控采集等
- 块大小(bs)影响显著:bs=4K 接近数据库小 IO,bs=1M~4M 更贴近视频或备份的大块吞吐;高性能 NVMe 可试 bs=64M
- 确认测试文件已落盘:写完后执行 sync,尤其未用 oflag=direct 时
注意这些常见误区
- 不用 dd if=/dev/sdb of=/dev/null 测整盘——可能卡在坏道或 SMR 区域,且无法区分读模式
- count=1 太小(如 bs=1G count=1)统计失真严重,至少保证总数据量 ≥512MB
- 别依赖 status=progress 的实时速率,只看最终输出里 “X bytes copied, Y s, Z MB/s” 这行
- 它不测 4K 随机读写、IOPS、延迟——这些要用 fio 或 iostat -x 补充










