dd 测试出来的写速度比读速度更大

2014-07-25 11:24:51 +08:00
 DjvuLee
time dd if=/dev/zero bs=10k count=1000000 of=/1Gb.file 测出来的纯写速度为944MB/s
time dd if=/1Gb.file bs=10k |dd of=/dev/null 测试出来的纯读速度只有420MB/s

一般而言,不应该是写的速度比读的速度慢吗?
4080 次点击
所在节点    Linux
18 条回复
Earthman
2014-07-25 12:21:11 +08:00
写有缓存,读一般不会缓存那么多
你试试写一个超过空闲内存大小的文件,后面一定慢下来;你这个944MB/s基本就是内存的带宽了
读一些比较小的文件,第一次会比较慢,马上再读,飞一般的速度

你丫当初没学操作系统么?
satanwoo
2014-07-25 12:23:27 +08:00
@Earthman 不一定吧,说不定他这是连续写和随机读呢,跟缓存就没关系了。
sNullp
2014-07-25 12:27:01 +08:00
@Earthman 内存带宽应该远远不止1G/s
xinglp
2014-07-25 12:32:38 +08:00
不用管道呢
DjvuLee
2014-07-25 12:47:02 +08:00
@Earthman 大哥,首先感谢你的回答。但是你有必要粗言粗语吗?您要是精通操作系统,内存的带宽这种常见参数还不清楚?您说内存带宽是944MB/s,您是在开玩笑吗?
我考虑过缓存,我以为bs指定的就是缓存,当然我可能没仔细看。
DjvuLee
2014-07-25 12:47:32 +08:00
@satanwoo 同一个文件,怎么可能是连续写和随机读呢?
satanwoo
2014-07-25 12:50:54 +08:00
@DjvuLee 我的意思是,同一个文件不一定是连续存放呢。。你写的时候可以连续写呀。我是这个意思。
satanwoo
2014-07-25 12:56:56 +08:00
@DjvuLee 哦,你是写完以后立刻读,那我搞错了,不好意思。。
DjvuLee
2014-07-25 12:59:34 +08:00
@xinglp 你的说法是正确的,是用管道导致的。多谢!
DjvuLee
2014-07-25 13:00:51 +08:00
@satanwoo 嗯,也很感谢你的回答。
gqlxj1987
2014-07-25 13:11:44 +08:00
有参数,是不用缓存,直接写磁盘的
Earthman
2014-07-25 13:45:25 +08:00
@sNullp 千奇百怪的系统,还真有这个带宽的系统
Earthman
2014-07-25 13:52:48 +08:00
@DjvuLee 我是怀着好意回复的,我这里不认为以上回复有任何带有歧视或者骂人的文字。可能由于地域差异,有理解上的不同。你跑OS,跑了一些任务当然体现出较低的内存速率。如果直接DMA操作,那就是真实的内存带宽,不过这是不合适的
msg7086
2014-07-25 14:48:53 +08:00
fdatasync
DjvuLee
2014-07-25 15:00:32 +08:00
@Earthman 那不好意思,可能确实地域不同,理解有差别。
DjvuLee
2014-07-25 15:05:29 +08:00
本着学习的态度,我把这个问题总结下来:

通常情况下,写肯定是会比慢的,但是之所以出现这种我测出的结果,确实是由于管道导致。

抛开管道这个问题,读和写的速度都太高了,不正常,这个是由于dd的用法导致的。我上面测出来的方法是dd只是把任务交给os,但是os还没有保证已经完成读写任务的情况下,dd就返回了完成时间,所以导致速度偏高,解决方法是添加fdatasync。

另外,附上一篇文章,关于用dd来磁盘速度: https://romanrm.net/dd-benchmark
tonyluj
2014-07-25 21:28:34 +08:00
看了一下dd的源码
dd是直接调用read,write是直接write
里面有个buffer,也就是LZ指定的bs,其他的完全交给OS
因为write和read都有cache

要想cache的作用最小化,直接给open()指定O_DIRECT就可以了
DjvuLee
2014-07-26 12:09:11 +08:00
@tonyluj 赞严谨!总结中确实没说清。确实bs是指定用户空间的缓存大小。不指定O_DIRECT,使用标准的文件访问方式,指定了则使用直接IO访问方式,没有kernel的缓存。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/124427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX