“dd”中的“bs”选项是否真的提高了速度?

我时不时地被告知,为了提高“dd”的速度,我应该仔细select一个合适的“块大小”。

即使在这里,在ServerFault上,别人写道 :“ …最佳块大小是依赖于硬件的… ” (iain)或“ …完美的大小将取决于您的系统总线,硬盘控制器,特定的驱动器本身,以及每个人的驱动程序…… “ (chris-s)

由于我的感觉有点不一样( 顺便说一下,我认为深度调整bs参数所需的时间远远高于收到的收益,就省时而言,默认值是合理的 ),今天我刚去通过一些快速和肮脏的基准。

为了降低外部影响,我决定阅读:

  • 从一个外部MMC卡
  • 从一个内部分区

和:

  • 与相关的文件系统未被占用
  • 将输出发送到/ dev / null以避免与“写入速度”相关的问题;
  • 避免了HDDcaching的一些基本问题,至less在涉及HDD时。

在下表中,我报告了我的发现,用不同的“bs”值读取1GB的数据( 你可以在这个消息的最后find原始数据 ):

在这里输入图像描述

基本上是这样的:

  • MMC:有一个bs = 4(是!4字节),我达到了12MB / s的吞吐量。 从bs = 5及以上得到的最大值为14.2 / 14.3;

  • 硬盘:有一个BS = 10我达到了30 MB /秒。 肯定低于默认的bs = 512得到的95.3 MB,但是…也很重要。

另外,CPU系统时间与bs值成反比是非常明显的(但是这听起来是合理的,因为bs越低,由dd产生的系统调用的数量越高)。

说完所有上述内容,现在的问题是:有人可以解释(内核黑客?)这种吞吐量中涉及的主要组件/系统是什么,如果真的值得指定高于默认值的bs,


MMC案例 – 原始数字

BS = 1M

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1M count=1000 1000+0 record dentro 1000+0 record fuori 1048576000 byte (1,0 GB) copiati, 74,1239 s, 14,1 MB/s real 1m14.126s user 0m0.008s sys 0m1.588s 

BS = 1K

 root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1k count=1000000 1000000+0 record dentro 1000000+0 record fuori 1024000000 byte (1,0 GB) copiati, 72,7795 s, 14,1 MB/s real 1m12.782s user 0m0.244s sys 0m2.092s 

BS = 512

 root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=512 count=2000000 2000000+0 record dentro 2000000+0 record fuori 1024000000 byte (1,0 GB) copiati, 72,867 s, 14,1 MB/s real 1m12.869s user 0m0.324s sys 0m2.620s 

BS = 10

 root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=10 count=100000000 100000000+0 record dentro 100000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 70,1662 s, 14,3 MB/s real 1m10.169s user 0m6.272s sys 0m28.712s 

BS = 5

 root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=5 count=200000000 200000000+0 record dentro 200000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 70,415 s, 14,2 MB/s real 1m10.417s user 0m11.604s sys 0m55.984s 

BS = 4

 root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=4 count=250000000 250000000+0 record dentro 250000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 80,9114 s, 12,4 MB/s real 1m20.914s user 0m14.436s sys 1m6.236s 

BS = 2

 root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=2 count=500000000 500000000+0 record dentro 500000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 161,974 s, 6,2 MB/s real 2m41.976s user 0m28.220s sys 2m13.292s 

BS = 1

 root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1 count=1000000000 1000000000+0 record dentro 1000000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 325,316 s, 3,1 MB/s real 5m25.318s user 0m56.212s sys 4m28.176s 

硬盘盒 – 原始数字

BS = 1

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1 count=1000000000 1000000000+0 record dentro 1000000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 341,461 s, 2,9 MB/s real 5m41.463s user 0m56.000s sys 4m44.340s 

BS = 2

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=2 count=500000000 500000000+0 record dentro 500000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 164,072 s, 6,1 MB/s real 2m44.074s user 0m28.584s sys 2m14.628s 

BS = 4

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=4 count=250000000 250000000+0 record dentro 250000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 81,471 s, 12,3 MB/s real 1m21.473s user 0m14.824s sys 1m6.416s 

BS = 5

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=5 count=200000000 200000000+0 record dentro 200000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 66,0327 s, 15,1 MB/s real 1m6.035s user 0m11.176s sys 0m54.668s 

BS = 10

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=10 count=100000000 100000000+0 record dentro 100000000+0 record fuori 1000000000 byte (1,0 GB) copiati, 33,4151 s, 29,9 MB/s real 0m33.417s user 0m5.692s sys 0m27.624s 

bs = 512(抵消读取,避免caching)

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=512 count=2000000 skip=6000000 2000000+0 record dentro 2000000+0 record fuori 1024000000 byte (1,0 GB) copiati, 10,7437 s, 95,3 MB/s real 0m10.746s user 0m0.360s sys 0m2.428s 

bs = 1k(偏移读取,以避免caching)

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1k count=1000000 skip=6000000 1000000+0 record dentro 1000000+0 record fuori 1024000000 byte (1,0 GB) copiati, 10,6561 s, 96,1 MB/s real 0m10.658s user 0m0.164s sys 0m1.772s 

bs = 1k(偏移读取,以避免caching)

 root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1M count=1000 skip=7000 1000+0 record dentro 1000+0 record fuori 1048576000 byte (1,0 GB) copiati, 10,7391 s, 97,6 MB/s real 0m10.792s user 0m0.008s sys 0m1.144s 

    你所做的只是读取速度testing。 如果您实际上正在将块复制到另一个设备中,而在另一个设备正在接受要写入的数据时,则在该读取过程中暂停,发生这种情况时,可能会在读取设备上遇到旋转延迟问题(如果是硬盘)等从硬盘中读取1M块的速度通常要快得多,因为这种方法不太经常出现旋转延迟。

    我知道当我复制硬盘时,通过指定bs=1M比通过使用bs=4k或缺省值获得更快的速度。 我说的速度提高了30到300%。 除非你每天都做,否则没有必要调整它绝对最好的。 但是select比默认更好的东西可以减less执行时间。

    当你真正使用它的时候,尝试一些不同的数字,然后发送一个SIGUSR1信号让它发出一个状态报告,这样你就可以看到它是怎么回事了。

    关于内部硬盘,至less – 当你从设备读取时,块层至less需要检索一个512字节的扇区。

    所以,当处理一个1字节的读取时,你只能从磁盘上读取扇区alignment的字节。 其余的511次由caching提供。

    你可以certificate这个如下,在这个例子中sdb是一个感兴趣的磁盘:

     # grep sdb /proc/diskstats 8 16 sdb 767 713 11834 6968 13710 6808 12970792 6846477 0 76967 6853359 ... # dd if=/dev/sdb of=/dev/null bs=1 count=512 512+0 records in 512+0 records out 512 bytes (512 B) copied, 0.0371715 s, 13.8 kB/s # grep sedb /proc/diskstats 8 16 sdb 768 713 11834 6968 13710 6808 12970792 6846477 0 76967 6853359 ... 

    第四列(计数读取)表示只发生了1次读取,尽pipe事实上您请求了1个字节的读取。 这是预料之中的行为,因为此设备(SATA 2磁盘)必须至less返回其扇区大小。 内核只是caching整个部门。

    这些大小请求中最大的影响因素是发出系统调用进行读取或写入的开销。 实际上,发出<512的呼叫是低效的。 非常大的读取需要更less的系统调用,但需要花费更多的内存来完成。

    4096通常是一个“安全”的阅读数字,因为:

    • 在caching上读取(默认)页面是4k。 用<4K读取页面比保持读取和页面大小更复杂。
    • 大多数文件系统块大小设置为4k。
    • 它的数目并不是一个足够小的数目(也许对于现在的固态硬盘来说)会导致系统调用的开销,但是没有足够多的数量来消耗大量的内存。