dd命令测试磁盘写速率的一个疑问

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

dd命令测试磁盘写速率的一个疑问

#1

帖子 jiandan23 » 2014-10-12 14:51

比如采用命令dd if=/dev/zero of=./test.dat bs=4k count=1M 测试磁盘的写速率。
当内存足够大时,dd命令是等数据完全写入磁盘才返回,还是只要数据写入cache了就立刻返回?
如果是要等到数据完全写入磁盘才返回,那么conv=fsync该选项有何作用?
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: dd命令测试磁盘写速率的一个疑问

#2

帖子 自由建客 » 2014-10-12 15:03

测速用 hdparm -Tt /dev/sda
头像
xzc8825745
帖子: 622
注册时间: 2011-06-04 20:24
联系:

Re: dd命令测试磁盘写速率的一个疑问

#3

帖子 xzc8825745 » 2014-10-12 15:15

dd如果不带fsync那么就是写入到了缓存中后就会立刻返回,所以的出的写入速度不准,带上fsync之后是数据写入到了硬盘后才返回,这个时候显示的速度就是硬盘实际写入速度。二楼的命令只能用来测试读取速度,不能用来测试写入速度。
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: dd命令测试磁盘写速率的一个疑问

#4

帖子 jiandan23 » 2014-10-13 14:39

xzc8825745 写了:dd如果不带fsync那么就是写入到了缓存中后就会立刻返回,所以的出的写入速度不准,带上fsync之后是数据写入到了硬盘后才返回,这个时候显示的速度就是硬盘实际写入速度。二楼的命令只能用来测试读取速度,不能用来测试写入速度。
首先感谢3楼的回复。但我在测试中发现一个问题,首先贴一下我测试的截图(我服务器的内存是256G,足够大了,硬盘是SSD的):
捕获.JPG
可以看出来,使用conv=fsync,速度也只有二百多,而如果是写入内存的话,速度最起码也有1GB/s。
同时,在执行dd时,我利用free -m查看了一下cache的大小:cache在不到4秒的时间内就由36M上升到了4136M。这说明,dd命令用了不到4秒就4GB大小的数据写入了缓存。
这就比较奇怪了,究竟dd退出之前需不需要等缓存中的数据写入磁盘?
poloshiao
论坛版主
帖子: 18279
注册时间: 2009-08-04 16:33

Re: dd命令测试磁盘写速率的一个疑问

#5

帖子 poloshiao » 2014-10-13 15:58

究竟dd退出之前需不需要等缓存中的数据写入磁盘?
http://www.slashroot.in/linux-file-syst ... mance-test
the speed that dd reported to us is the speed with which data was cached to RAM memory, not to the disk.
可以看出来,使用conv=fsync,速度也只有二百多,
http://www.slashroot.in/comment/60#comment-60
fsync issues two write operation requests(One for data another for metadata..modified time etc to the disk.)
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: dd命令测试磁盘写速率的一个疑问

#6

帖子 astolia » 2014-10-13 17:31

如果要作测试用,那么bs参数该尽量大一点。在dd的实现中,bs越小,在程序内部的消耗越多,执行越慢
以下是某台服务器上的测试结果

代码: 全选

$ dd if=/dev/zero of=/tmp/a bs=1k count=1M
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 3.32677 s, 323 MB/s
$ dd if=/dev/zero of=/tmp/b bs=1M count=1k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.97741 s, 1.1 GB/s
$ dd if=/dev/zero of=/tmp/c bs=1M count=1k conv=fsync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 8.56469 s, 125 MB/s
$ dd if=/dev/zero of=/tmp/d bs=1k count=1M conv=fsync
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 8.05747 s, 133 MB/s
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: dd命令测试磁盘写速率的一个疑问

#7

帖子 jiandan23 » 2014-10-15 10:25

bs参数的确会影响速率。但我的差别没有astolia的大!
另外,我还发现一个问题:
在执行dd if=/dev/zero of=test.dat bs=4k count=1M时,如果是第一次执行(目录下没有test.dat文件时),dd将数据写入缓存就立刻退出了。
如果立刻执行第二次(目录下已经存在了一个test.dat文件),那么dd在将数据写入缓存时会等待数据同步到磁盘才退出。如下所示:
[img]捕获.JPG[/img]
附件
捕获.JPG
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: dd命令测试磁盘写速率的一个疑问

#8

帖子 astolia » 2014-10-15 12:56

jiandan23 写了:bs参数的确会影响速率。但我的差别没有astolia的大!
另外,我还发现一个问题:
在执行dd if=/dev/zero of=test.dat bs=4k count=1M时,如果是第一次执行(目录下没有test.dat文件时),dd将数据写入缓存就立刻退出了。
如果立刻执行第二次(目录下已经存在了一个test.dat文件),那么dd在将数据写入缓存时会等待数据同步到磁盘才退出。如下所示:
[img]捕获.JPG[/img]
用非全0输入比如/dev/urandom来替代/dev/zero,不管是新建还是覆盖的速度都是差不多的
全0输入去新建文件,感觉系统调用或文件系统实现上可能有类似稀疏文件的快速处理方法
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: dd命令测试磁盘写速率的一个疑问

#9

帖子 jiandan23 » 2014-10-16 14:09

如果是读取urandom,那么整个IO速度的瓶颈应当在生成随机数的速度上面。
我在服务器上面执行“dd if=/dev/urandom of=/dev/null bs=4k count=1M”和
“dd if=/dev/urandmom of=test.dat bs=4k count=1M”所花费的时间是一样的,都很长
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: dd命令测试磁盘写速率的一个疑问

#10

帖子 astolia » 2014-10-24 9:59

jiandan23 写了:如果是读取urandom,那么整个IO速度的瓶颈应当在生成随机数的速度上面。
我在服务器上面执行“dd if=/dev/urandom of=/dev/null bs=4k count=1M”和
“dd if=/dev/urandmom of=test.dat bs=4k count=1M”所花费的时间是一样的,都很长
是的,我上面的理解有误。
覆写比新建慢的原因是覆写时会先把缓存里的数据写入磁盘,并非是你所说的“在将数据写入缓存时会等待数据同步到磁盘才退出”
把同步的时间扣掉的话,两者就差不多了,覆写一般还会快一点
$ dd if=/dev/zero of=/tmp/a bs=1k count=100k;time sync
102400+0 records in
102400+0 records out
104857600 bytes (105 MB) copied, 0.329158 s, 319 MB/s

real 0m0.648s
user 0m0.000s
sys 0m0.009s
$ dd if=/dev/zero of=/tmp/a bs=1k count=100k;time sync
102400+0 records in
102400+0 records out
104857600 bytes (105 MB) copied, 0.767444 s, 137 MB/s

real 0m0.150s
user 0m0.000s
sys 0m0.012s
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: dd命令测试磁盘写速率的一个疑问

#11

帖子 jiandan23 » 2014-10-25 10:18

多谢astolia的关注 :em01
但是从你的贴图来看,第一次的dd命令之后已经作了同步,理应缓存的数据已经写入了磁盘。那为什么第二次的dd命令还需要0.767444 s呢?
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: dd命令测试磁盘写速率的一个疑问

#12

帖子 astolia » 2014-10-25 18:03

系统缓存机制不同导致的呗,dd不一定一点数据都不实际写入就退出了
在另外一台桌面电脑上就是
$ dd if=/dev/zero of=/tmp/a bs=1k count=100k;time sync
102400+0 records in
102400+0 records out
104857600 bytes (105 MB) copied, 0.215946 s, 486 MB/s

real 0m3.227s
user 0m0.000s
sys 0m0.003s
$ dd if=/dev/zero of=/tmp/a bs=1k count=100k;time sync
102400+0 records in
102400+0 records out
104857600 bytes (105 MB) copied, 0.217913 s, 481 MB/s

real 0m3.133s
user 0m0.001s
sys 0m0.010s
但不管怎样dd+sync的时间总和基本都一样
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: dd命令测试磁盘写速率的一个疑问

#13

帖子 jiandan23 » 2014-10-27 14:13

astolia兄,你的这组数据是用什么操作系统测得的。
我在redhat上测试,只要是覆盖,无论之前是否调用sync,时间都比新建的长:
捕获.JPG
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: dd命令测试磁盘写速率的一个疑问

#14

帖子 astolia » 2014-10-27 22:06

你的服务器上dd+sync的总时间,覆写也是略小于新建,说明是正常的。
你可以试试用vmstat或iostat看一下具体io发生的时机

代码: 全选

vmstat -d;dd if=/dev/zero of=/tmp/a bs=1k count=100k;vmstat -d;time sync;vmstat -d
或
iostat -d;dd if=/dev/zero of=/tmp/a bs=1k count=100k;iostat -d;time sync;iostat -d
我在服务器上看到的,新建文件时,io全部产生在sync时。而覆写时,只有接近四分之一的io数是在sync时。上面10楼time记录的时间比也是这么多
回复