V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
DjvuLee
V2EX  ›  Linux

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

  •  
  •   DjvuLee · 2014-07-25 11:24:51 +08:00 · 4073 次点击
    这是一个创建于 3799 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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

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

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

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

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

    另外,附上一篇文章,关于用dd来磁盘速度: https://romanrm.net/dd-benchmark
    tonyluj
        17
    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
        18
    DjvuLee  
    OP
       2014-07-26 12:09:11 +08:00
    @tonyluj 赞严谨!总结中确实没说清。确实bs是指定用户空间的缓存大小。不指定O_DIRECT,使用标准的文件访问方式,指定了则使用直接IO访问方式,没有kernel的缓存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:59 · PVG 17:59 · LAX 01:59 · JFK 04:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.