「dd」の「bs」オプションは本当に速度を改善しますか?


58

時々、「dd」の速度を上げるには、適切な「ブロックサイズ」を慎重に選択する必要があると言われています。

ここでも、ServerFaultの上、他の誰かが書いた「という... ...最適なブロックサイズは、ハードウェアに依存している(イアン)または「...完璧なサイズは、システム・バス、ハードドライブコントローラ、特定のドライブに依存しますそれ自体、およびそれらのそれぞれのドライバー... " (chris-s)

私の気持ちが少し違っていたので(ところで:bsパラメーターを深く調整するのに必要な時間は、時間節約の観点から、受け取ったゲインよりもはるかに長く、デフォルトは合理的だと思っていました)、今日私はちょうど行きましたいくつかの迅速で汚れたベンチマークを通じて。

外部の影響を減らすために、私は読むことにしました:

  • 外部MMCカードから
  • 内部パーティションから

そして:

  • 関連するファイルシステムがアンマウントされている
  • 「書き込み速度」に関連する問題を回避するために、出力を/ dev / nullに送信します。
  • 少なくともHDDに関係する場合、HDDキャッシングのいくつかの基本的な問題を回避します。

次の表では、「bs」の値が異なる1GBのデータを読み取った結果を報告しました(このメッセージの最後に生の数値があります)。

ここに画像の説明を入力してください

基本的には次のようになりました:

  • MMC:bs = 4(yes!4バイト)で、スループットが12MB / sに達しました。bs = 5以上から得た最大14.2 / 14.3までのそれほど遠くない値。

  • HDD:bs = 10の場合、30 MB / sに達しました。デフォルトのbs = 512で得られた95.3 MBよりも確かに低いですが、...重要です。

また、CPUのsys-timeはbsの値に反比例することは非常に明らかでした(しかし、bsが低いほど、ddによって生成されるsys-callの数が多くなるので、これは妥当と思われます)。

上記のすべてを言った今、質問:誰かがそのようなスループットに関与する主要なコンポーネント/システムとは何か(カーネルハッカー?)を説明できますか、そしてデフォルトよりも高い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

HDDケース-生番号

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(キャッシュを回避するために、読み取りをオフセットします)

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(読み取りをオフセットし、キャッシュを回避します)

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(読み取りをオフセットし、キャッシュを回避します)

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

11
本当に良いのは、デバイスから最適なbsパラメータを検出して使用するbs=auto機能を備えてddいることです。

4
何だろう、非常に素敵なことは、いくつかのグラフであるbs速さの代わりに、単一の質問で15ダースのコードブロックに対してプロットサイズ。スペースが少なくてすみ、読みやすさが無限に速くなります。絵は本当にある thoursand言葉に値します。
MDMoore313 14

2
@BigHomie-グラフを提供することを考えましたが...「スケーリング」の問題がいくつかあります。おそらく、両方の軸の対数目盛が必要になります...これを考えながら、私はそれを解決するのは簡単な(そして迅速な)問題ではないと考えました。そこで、「テーブル」バージョンに切り替えました。「... 15ダースのコードブロック」については、(個人的な、私の)干渉を避けるために、誰もが「生の数字」をチェックする機会を得たいと思いました。
ダミアーノヴェルズリ14

1
@DamianoVerzulliテーブルはクールです、私の暴言を無視してください、とにかく私たちの迷信を証明するための賛成票を与えました、そして、バイトサイズをいじることが速度を変えることを直接知っています、私もそれを答えに入れるかもしれません。
MDMoore313 14

1
@warrenは-あなたも行うことができます4Gを取得するbs=8k count=512Kか、bs=1M count=4K私は2 65536過去の権力覚えていない
user313114

回答:


24

行ったのは、読み取り速度のテストのみです。実際にブロックを別のデバイスにコピーしている場合、書き込みたいデータを他のデバイスが受け入れている間に読み取りが一時停止します。これが発生すると、読み取りデバイス(ハードディスクの場合)で回転遅延の問題が発生する可能性がありますHDDから1Mのチャンクを読み取る方がはるかに高速であることがよくあります。そうしないと、回転待ち時間が少なくなります。

ハードディスクをコピーするときは、デフォルトbs=1Mを使用するよりも指定する方が高速になりbs=4kます。私は30〜300%の速度改善について話している。毎日行う必要がある場合を除き、絶対に最適な状態に調整する必要はありません。ただし、デフォルトよりも優れたものを選択すると、実行時間を数時間短縮できます。

実際に使用している場合は、いくつかの異なる数値を試して、ddプロセスにSIGUSR1シグナルを送信し、ステータスレポートを発行してプロセスの進行状況を確認してもらいます。

✗ killall -SIGUSR1 dd
1811+1 records in
1811+1 records out
1899528192 bytes (1.9 GB, 1.8 GiB) copied, 468.633 s, 4.1 MB/s

2014 Macbook Pro Retinaの90 MB / s書き込み速度のUSB3スティックへのコピー:$ sudo dd if=~/Downloads/Qubes-R4.0-rc4-x86_64.iso of=/dev/rdisk2 status=progressショー6140928 bytes (6.1 MB, 5.9 MiB) copied, 23 s, 267 kB/s。時間がかかりすぎたため、これをキャンセルしました。バイトサイズの指定:$ sudo dd if=~/Downloads/Qubes-R4.0-rc4-x86_64.iso of=/dev/rdisk2 bs=1M status=progressショー4558159872 bytes (4.6 GB, 4.2 GiB) copied, 54 s, 84.4 MB/s
エリックダンカン

9

少なくとも内蔵ハードディスクに関しては、デバイスから読み取る場合、ブロック層は少なくとも 512バイトの1つのセクターを取得する必要があります。

そのため、1バイトの読み取りを処理する場合、セクタアライメントされたバイトの取得時にディスクから実際に読み取っただけです。残りの511回はキャッシュによって処理されます。

これは次のように証明できます。この例で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
...

4番目の列(読み取りをカウントする)は、1バイトの読み取りを要求したにもかかわらず、1回の読み取りのみが発生したことを示します。このデバイス(SATA 2ディスク)は、少なくともセクターサイズを返す必要があるためこれは予想される動作です。カーネルは単にセクター全体をキャッシュしています。

これらのサイズ要求で最も重要な要因は、読み取りまたは書き込みのシステムコールを発行するオーバーヘッドです。実際、512未満の呼び出しを発行するのは非効率的です。読み取りが非常に大きい場合、必要なシステムコールは少なくなりますが、メモリの使用量が増えます。

通常、4096は読み取りの「安全な」数値です。

  • キャッシュをオンにして(デフォルト)ページを読むと、ページは4kになります。ページを4k未満の読み取りで埋めるのは、読み取りとページサイズを同じに保つよりも複雑です。
  • ほとんどのファイルシステムのブロックサイズは4kに設定されています。
  • syscallのオーバーヘッドを発生させるのに十分な数ではありませんが(SSDの場合もあります)、大量のメモリを消費するほどの数ではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.