使用 DD 命令在 Linux 下做硬盘速度测试的基本命令格式

$ dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks

磁盘写测试

以下命令将 4k 大小的块写入写入当前工作路径下的 testw.dbf 文件,写入大小总计 400Mb。

$ time dd if=/dev/zero of=testw.dbf bs=4k count=100000

100000+0 records in
100000+0 records out
409600000 bytes transferred in 3.687499 secs (111078002 bytes/sec)

real	0m3.874s
user	0m0.214s
sys	0m2.091s

/dev/zero 是伪设备,只产生空字符流,不会产生 IO,因此 IO 都集中在 of 文件中,of 文件只用于写,所以这个命令相当于测试磁盘的写能力。命令结尾添加 oflag=direct 将跳过内存缓存,添加oflag=sync 将跳过 hdd 缓存。

磁盘读测试

假设待测设备为 /dev/sdb,以下命令将从待测设备上读取 400Mb 的 4k 块。

$ time dd if=/dev/sdb of=/dev/null bs=4k count=100000

/dev/sdb 是物理分区,读取会产生IO。/dev/null 是伪设备,相当于黑洞不会产生 IO,相当于测试磁盘的读能力。

测试磁盘同时读写能力

以下命令将从 /dev/sdb 设备读取 400Mb 的 4k 块写入到当前工作路径下的 testrw.dbf 文件。

$ time dd if=/dev/sdb of=testrw.dbf bs=4k

if 和 of 都是物理文件,均产生 IO,当两端在同一设备时,即可得出同时读写的性能信息。

纯写测试

$ dd if=/dev/zero of=test bs=8k count=10000 oflag=direct

纯读测试

$ dd if=test of=/dev/null bs=8k count=10000 iflag=direct

总结

DD 只能得出大概的测试结果,由于它是连续 I/O 不是随机 I/O,理论上文件规模越大,测试结果越准确。同时,iflag/oflag 提供 direct 模式,direct 模式是把写入请求直接封装成 I/O 指令发到磁盘,非 direct 模式只是把数据写入到系统缓存就认为 I/O 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘。

Reference