dd 测试出来的写速度比读速度更大
- 0次
- 2021-07-16 15:54:38
- idczone
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
一般而言,不应该是写的速度比读的速度慢吗?
写有缓存,读一般不会缓存那么多
你试试写一个超过空闲内存大小的文件,后面一定慢下来;你这个944MB/s基本就是内存的带宽了
读一些比较小的文件,第一次会比较慢,马上再读,飞一般的速度
你丫当初没学操作系统么?
不一定吧,说不定他这是连续写和随机读呢,跟缓存就没关系了。
内存带宽应该远远不止1G/s
不用管道呢
大哥,首先感谢你的回答。但是你有必要粗言粗语吗?您要是精通操作系统,内存的带宽这种常见参数还不清楚?您说内存带宽是944MB/s,您是在开玩笑吗?
我考虑过缓存,我以为bs指定的就是缓存,当然我可能没仔细看。
同一个文件,怎么可能是连续写和随机读呢?
我的意思是,同一个文件不一定是连续存放呢。。你写的时候可以连续写呀。我是这个意思。
哦,你是写完以后立刻读,那我搞错了,不好意思。。
你的说法是正确的,是用管道导致的。多谢!
嗯,也很感谢你的回答。
有参数,是不用缓存,直接写磁盘的
千奇百怪的系统,还真有这个带宽的系统
我是怀着好意回复的,我这里不认为以上回复有任何带有歧视或者骂人的文字。可能由于地域差异,有理解上的不同。你跑OS,跑了一些任务当然体现出较低的内存速率。如果直接DMA操作,那就是真实的内存带宽,不过这是不合适的
fdatasync
那不好意思,可能确实地域不同,理解有差别。
本着学习的态度,我把这个问题总结下来:
通常情况下,写肯定是会比慢的,但是之所以出现这种我测出的结果,确实是由于管道导致。
抛开管道这个问题,读和写的速度都太高了,不正常,这个是由于dd的用法导致的。我上面测出来的方法是dd只是把任务交给os,但是os还没有保证已经完成读写任务的情况下,dd就返回了完成时间,所以导致速度偏高,解决方法是添加fdatasync。
另外,附上一篇文章,关于用dd来磁盘速度: https://romanrm.net/dd-benchmark
看了一下dd的源码
dd是直接调用read,write是直接write
里面有个buffer,也就是LZ指定的bs,其他的完全交给OS
因为write和read都有cache
要想cache的作用最小化,直接给open()指定O_DIRECT就可以了
赞严谨!总结中确实没说清。确实bs是指定用户空间的缓存大小。不指定O_DIRECT,使用标准的文件访问方式,指定了则使用直接IO访问方式,没有kernel的缓存。