正确用dd测试磁盘写速度

来源:互联网 发布:淘宝搜索宝贝显示地址 编辑:程序博客网 时间:2024/05/01 14:05

正确用DD测试磁盘读写速度


问: 以下几种方式测试磁盘读写速度有什么区别?

1
2
3
4

dd bs=1M count=128 if=/dev/zero of=test 
dd bs=1M count=128 if=/dev/zero of=testsync 
dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync
dd bs=1M count=128 if=/dev/zero of=test oflag=dsync

答:区别在于内存中写缓存的处理方式。
1.

dd bs=1M count=128 if=/dev/zero of=test

没有加任何参数,dd默认的方式不包括“同步(sync)”命令。也就是说,dd命令完成前并没有让系统真正把文件写到磁盘上。所以以上命令只是单纯地把这128MB的数据读到内存缓冲当中(写缓存[write cache])。所以你得到的将是一个超级快的速度。因为其实dd给你的只是读取速度,直到dd完成后系统才开始真正往磁盘上写数据,但这个速度你是看不到了。所以如果这个速度很快,先不要偷着乐。呵呵
2.

dd bs=1M count=128 if=/dev/zero of=testsync

和前面1中的完全一样。分号隔开的只是先后两个独立的命令。当sync命令准备开始往磁盘上真正写入数据的时候,前面dd命令已经把错误的“写入速度”值显示在屏幕上了。所以你还是得不到真正的写入速度。
3.

dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync

加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,所以这时候你得到的是读取这128M数据到内存并写入到磁盘上所需的时间,这样算出来的时间才是比较符合实际的。
4.

dd bs=1M count=128 if=/dev/zero of=test oflag=dsync

加入这个参数后,dd在执行时每次都会进行同步写入操作。也就是说,这条命令每次读取1M后就要先把这1M写入磁盘,然后再读取下面这1M,一共重复128次。这可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。

问:那应该用哪一种呢?
答:建议使用

dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync

因为这种方式最接近计算机实际操作,所以测出来的数据最有参考价值。









正确的使用dd进行磁盘读写速度测试


http://elf8848.iteye.com/blog/2089055

测试方式:使用dd指令,对磁盘进行连续写入,不使用内存缓冲区,每次写入8k的数据,总共写入20万次,产生1.6G大小的文件。

测试指令:dd if=/dev/zero of=/data01/test.dbf bs=8k count=200000 conv=fdatasync

----------------------------------------------

 

正确的使用dd进行磁盘读写速度测试
dd是Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,所以可以用来测试硬盘的顺序读写能力。可以写文件,可以写裸设备。


dd语法
---------------------------------------------------------
功能说明:读取,转换并输出数据。
语  法:dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=<字节数>][if=<文件>][obs=<字节数>][of=<文件>][seek=<区块数>][skip=<区块数>][--help][--version]
补充说明:dd可从标准输入或文件读取数据,依指定的格式来转换数据,再输出到文件,设备或标准输出。
参  数:
  bs=<字节数>   将ibs( 输入)与obs(输出)设成指定的字节数。
  cbs=<字节数>   转换时,每次只转换指定的字节数。
  conv=<关键字>   指定文件转换的方式。
  count=<区块数>   仅读取指定的区块数。
  ibs=<字节数>   每次读取的字节数。
  if=<文件>   从文件读取。
  obs=<字节数>   每次输出的字节数。
  of=<文件>   输出到文件。
  seek=<区块数>   一开始输出时,跳过指定的区块数。
  skip=<区块数>   一开始读取时,跳过指定的区块数。
  --help   帮助。
  --version   显示版本信息。

dd常用参数详解
---------------------------------------------------------
if=xxx  从xxx读取,如if=/dev/zero,该设备无穷尽地提供0,(不产生读磁盘IO)
of=xxx  向xxx写出,可以写文件,可以写裸设备。如of=/dev/null,"黑洞",它等价于一个只写文件. 所有写入它的内容都会永远丢失. (不产生写磁盘IO)
bs=8k  每次读或写的大小,即一个块的大小。
count=xxx  读写块的总数量。

避免操作系统“写缓存”干扰测试成绩,使用sync、fsync、fdatasync
---------------------------------------------------------
关于sync、fsync、fdatasync请参考:http://elf8848.iteye.com/blog/2088986

dd bs=8k count=4k if=/dev/zero of=test.log conv=fsync 
dd bs=8k count=4k if=/dev/zero of=test.log conv=fdatasync
dd bs=8k count=4k if=/dev/zero of=test.log oflag=dsync
dd bs=8k count=4k if=/dev/zero of=test.log  默认“写缓存”启作用
dd bs=8k count=4k if=/dev/zero of=test.log conv=sync   “写缓存”启作用
dd bs=8k count=4k if=/dev/zero of=test.log; sync   “写缓存”启作用

dd bs=8k count=4k if=/dev/zero of=test.log conv=fsync 
加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,,这样算出来的时间才是比较符合实际使用结果的。conv=fsync表示把文件的“数据”和“metadata”都写入磁盘(metadata包括size、访问时间st_atime & st_mtime等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,fsync 与fdatasync相差不大。(重要,最有参考价值)

dd bs=8k count=4k if=/dev/zero of=test.log conv=fdatasync
加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,,这样算出来的时间才是比较符合实际使用结果的。conv=fdatasync表示只把文件的“数据”写入磁盘,fsync 与fdatasync相差不大。(重要,最有参考价值)

dd bs=8k count=4k if=/dev/zero of=test.log oflag=dsync
加入这个参数后,每次读取8k后就要先把这8k写入磁盘,然后再读取下面一个8k,一共重复4K次。这是最慢的一种方式了。

dd bs=8k count=4k if=/dev/zero of=test
没加关于操作系统“写缓存”的参数,默认“写缓存”启作用。dd先把数据写的操作系统“写缓存”,就完成了写操作。通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数,把“写缓存”中的数据刷入磁盘。因为“写缓存”起作用,你会测试出一个超级快的性能。
如:163840000 bytes (164 MB) copied, 0.742906 seconds, 221 MB/s

dd bs=8k count=4k if=/dev/zero of=test conv=sync  
conv=sync参数明确“写缓存”启作用,默认值就是conv=sync 

dd bs=8k count=4k if=/dev/zero of=test; sync 
与第1个完全一样,分号隔开的只是先后两个独立的命令。当sync命令准备开始往磁盘上真正写入数据的时候,前面dd命令已经把错误的“写入速度”值显示在屏幕上了。所以你还是得不到真正的写入速度。


裸设备测试
----------------------
1、裸设备到文件系统
dd if=/dev/rsd1b of=/backup/df1.dbf bs=8k skip=8 count=3841
2、文件系统到裸设备
dd if=/backup/df1.dbf of=/dev/rsd2b bs=8k seek=8
更多关于裸设备,请参考:http://czmmiao.iteye.com/blog/1748748





问: 以下几种方式测试磁盘读写速度有什么区别?  

   dd bs=1M count=128 if=/dev/zero of=test    

   dd bs=1M count=128 if=/dev/zero of=test; sync    

   dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync    

   dd bs=1M count=128 if=/dev/zero of=test oflag=dsync

   答:区别在于内存中写缓存的处理方式。  

   dd bs=1M count=128 if=/dev/zero of=test    

   没有加任何参数,dd默认的方式不包括“同步(sync)”命令。也就是说,dd命令完成前并没有让系统真正把文件写到磁盘上。所以以上命令只是单纯地把这128MB的数据读到内存缓冲当中(写缓存[write cache])。所以你得到的将是一个超级快的速度。因为其实dd给你的只是读取速度,直到dd完成后系统才开始真正往磁盘上写数据,但这个速度你是看不到了。所以如果这个速度很快,先不要偷着乐。呵呵    

   dd bs=1M count=128 if=/dev/zero of=test; sync    

   和前面1中的完全一样。分号隔开的只是先后两个独立的命令。当sync命令准备开始往磁盘上真正写入数据的时候,前面dd命令已经把错误的“写入速度”值显示在屏幕上了。所以你还是得不到真正的写入速度。    

   dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync    

   加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,所以这时候你得到的是读取这128M数据到内存并写入到磁盘上所需的时间,这样算出来的时间才是比较符合实际的。    

   dd bs=1M count=128 if=/dev/zero of=test oflag=dsync    

   加入这个参数后,dd在执行时每次都会进行同步写入操作。也就是说,这条命令每次读取1M后就要先把这1M写入磁盘,然后再读取下面这1M,一共重复128次。这可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。    

   问:那应该用哪一种呢?    

   答:建议使用    

   dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync    

   因为这种方式最接近计算机实际操作,所以测出来的数据最有参考价值。

PS:

写: dd if=/dev/zero of=test.bin bs=4096 count=1M conv=fdatasync 

# 用sync不靠谱, 最好还是在开机的时候把内存设的很小, 测试文件的大小远远大于内存才比较合理.

读: dd if=test.bin of=/dev/null bs=4096 count=1M iflag=direct

原文 http://romanrm.ru/en/dd-benchmark  翻译 http://blog.csdn.net/xrb66/article/details/7180919



0 0