测裸盘真实写带宽需用dd直写块设备,命令为time dd if=/dev/zero of=/dev/sdb bs=1M count=2048 oflag=direct,sync,前提是设备未挂载、无LVM/RAID、已备份数据且以root执行。

要测裸盘真实写带宽,必须绕过文件系统和内核页缓存,直接向块设备写入——dd 本身支持裸设备操作,但风险高、条件严,不能随便用。
前提:确认设备状态与安全边界
裸写测试目标是 /dev/sdX 这类块设备(如 /dev/sdb),不是挂载点。操作前必须确保:
- 目标设备未被挂载(
mount | grep sdb应无输出),否则会破坏文件系统结构 - 设备上无正在运行的 LVM、RAID 或加密层(
lsblk -f和pvs/mdstat检查) - 已备份关键数据——
dd of=/dev/sdX是覆写行为,不可逆 - 使用 root 权限执行,普通用户无权直写裸设备
核心命令:强制直通 + 同步落盘
以下命令测的是「从应用层到磁盘介质」的纯硬件顺序写能力:
time dd if=/dev/zero of=/dev/sdb bs=1M count=2048 oflag=direct,sync
-
if=/dev/zero:零数据源,不引入读 IO 干扰 -
of=/dev/sdb:直接写裸设备,跳过文件系统层(无 ext4/xfs 日志、分配策略等开销) -
bs=1M:1MB 块大小平衡系统调用开销与设备吞吐,对多数 SATA/NVMe SSD 和 HDD 都较合理 -
count=2048:共写 2GB,足够摊平启动抖动,又不会耗时过长 -
oflag=direct,sync:双重保障——direct绕页缓存,sync确保每次 write() 返回前数据已刷入磁盘介质(尤其对带写缓存的 RAID 卡或 SATA SSD 必须)
结果解读与常见陷阱
输出末尾类似 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 8.32123 s, 258 MB/s 中的 258 MB/s 就是该设备在单线程、大块、顺序写下的物理带宽下限。
- 若结果远高于厂商标称值(如 SATA III 标出 550 MB/s 却测出 1.2 GB/s),大概率是误写了内存盘(如
/dev/ram0)或设备实际是 NVMe 被误识别为 SATA - 若多次运行结果波动剧烈(±30% 以上),说明设备存在写缓存且未被
sync充分压制,可改用oflag=direct,dsync进一步严格同步(速度会下降,但更贴近“掉电不丢数据”的场景) - 遇到
Invalid argument:可能是设备驱动不支持O_DIRECT(如某些 USB-SATA 桥接芯片),此时去掉oflag=direct,但结果需理解为「含缓存路径」,仅作相对对比参考
补充验证:用 hdparm 对照物理读能力
裸写后,可用 hdparm -t /dev/sdb 测裸设备顺序读(不含文件系统缓存),结果应与 dd 读测试(dd if=/dev/sdb of=/dev/null bs=1M iflag=direct)接近。若 dd 写速显著低于 hdparm 读速,说明写路径存在瓶颈(如控制器限速、队列深度不足),而非介质本身问题。

















