ddへのbsパラメータの最適値を決定する方法はありますか?


71

「デフォルト値には時間がかかりすぎるため、必ず「bs =」を設定してください」という行に沿ってオンラインでコメントを見たことがあります。先週の時間」はそれを支持するようです。そのため、「dd」を使用する場合(通常は1〜2 GBの範囲)、必ずbytesパラメーターを指定してください。約半分の時間で、コピー元のオンラインガイドで指定されている値を使用しています。残りの時間は、「fdisk -l」のリストから意味のある数字を選択します。これは、遅いメディア(たとえば、書き込み先のSDカード)であると推測されるものです。

特定の状況(メディアの種類、バスのサイズなど)について、「最適な」値を決定する方法はありますか?判断するのは簡単ですか?そうでない場合、そこにある方法の90〜95%を取得する簡単な方法はありますか。または、「512より大きいものを選ぶだけ」でさえ正しい答えですか?

私は実験を自分で試すことを考えましたが、(多くの作業に加えて)どの要因が答えに影響するかわからないので、良い実験を設計する方法がわかりません。


同じストレージメディアへの書き込みは、異なるストレージメディアへの書き込みとは異なり、異なる最適な設定が必要になります。デバイスの種類、速度、キャッシュなどに応じて、すべてのユーザーで異なる多くの変数があります。私のマシンではbs = 256Mが最適です。

回答:


27

dd古いIBMメインフレームテープを変換する必要があったときから遡り、ブロックサイズはテープまたはデータブロックの書き込みに使用されたものと一致する必要があり、スキップまたは切り捨てられました。(9トラックテープは細心の注意を払っていました。長い間死んでいました。)最近では、ブロックサイズはデバイスセクターサイズの倍数である必要があります(通常は4KB。ドライブは小さいかもしれませんが、4KBが妥当な中間点であり、大きいほどパフォーマンスが向上します。私はしばしばハードドライブで1MBのブロックサイズを使用します。(これらの日を振り回すためにより多くの記憶があります。)


ハードドライブまたはUSB大容量記憶装置は、512または4096(新しい)バイトです。光およびダイレクトアクセスフラッシュメディアは2048バイトです。4096バイトでも問題はありません。
ローレンス

3
コピープログラムのブロックサイズが、基礎となるデバイスの特性と関係があるのはなぜですか(テープは除く)。とにかく、カーネルは独自のバッファリング(およびプリフェッチ)を行います。
ジル

1
フラクショナルバッファを最小限に抑えるため。カーネルはセクター(または、より良いのはトラックまたはシリンダーですが、現代のドライブはそれらについてであると思います)およびカーネルバッファーの境界でバッファーの読み取り/書き込みを開始できるため、アライメントされたバッファーを使用すると一般的に物事が速くなりますものをスキップしたり、余分なものを読んだり、部分的なバッファを管理したりします。確かに、カーネルにすべてを処理させることができますが、ギガバイトのデータをコピーする場合、余分な作業によりコピー時間を大幅に削減できます。
ギーコサウルス

@Gillesコメント返信の通知を受け取りたい場合は、(通常)含める必要があります。コメント@repliesの仕組みをご覧ください。たまたま通り過ぎていたので、カーネルはとにかくそれを処理します。「その余分な作業によりコピー時間を大幅に短縮できる」というあなたの主張は私のベンチマークと一致しませんが、異なるシステムは異なる動作をする可能性があるので、タイミングにも貢献してください!
ジル

@Gilles:すみません、元の質問者と間違えていました。
ギーコサウルス

60

最適なブロックサイズを決定する方法は1つしかありませんが、これはベンチマークです。簡単なベンチマークを作成しました。テストマシンは、カーネル2.6.32とcoreutils 8.5を備えたDebian GNU / Linuxを実行しているPCです。関係する両方のファイルシステムは、ハードディスクパーティション上のLVMボリューム上のext3です。ソースファイルは2GB(正確には2040000kB)です。キャッシュとバッファリングが有効になっています。各実行の前に、でキャッシュを空にしましたsync; echo 1 >|/proc/sys/vm/drop_caches。実行時間にはsync、バッファーをフラッシュするための最終は含まれません。最終syncは1秒程度かかります。sameランは、同じファイルシステム上にコピーしました。diffランは別のハードディスク上のファイルシステムにコピーしました。一貫性を保つために、報告される時間は、time秒単位のユーティリティ。各コマンドを1回実行しただけなので、タイミングにどの程度のばらつきがあるかわかりません。

             same   diff
dd bs=64M    71.1   51.3
dd bs=1M     73.9   41.8
dd bs=4k     79.6   48.5
dd bs=512    85.3   48.9
cat          76.2   41.7
cp           77.8   45.3

結論:大きなブロックサイズ(数メガバイト)は役立ちますが、劇的ではありません(同じドライブのコピーで予想したよりもはるかに少ないです)。そしてcatcpそれほど悪いパフォーマンスをしないでください。これらの数字では、dd気にする価値はありません。と行くcat


OPに彼自身のベンチマークを行うことをお勧めしますが、とにかくいい答えです!
ninjalj

5
@Nikhil >|は、>以下set -o noclobberを使用する場合と同じですが、シェルを使用すると、ファイルが存在するというエラーが表示されます>
ジル

2
@Masiはい、ディスク全体を複製する場合は、を使用しますcat。なぜもっと良い方法を探しているのですか?何が問題なのcatですか?
ジル

5
@Masiはcat、入力を出力にコピーするだけです。信頼性の低いメディアからコピーして、読み取り不能な部分をスキップしたり、複数回再試行したい場合、それは別の問題であり、ddrescue非常にうまく機能します。
ジル

1
@sudoでコピーされたデータ量を取得できますlsof。インスタントスピードは均一であるため、ディスクコピーにはあまり関係がなく、転送されたバイトを経過時間で分割できます。より良いものが必要な場合は、を使用できますpv
ジル

8

サイズはブロックサイズの倍数である必要があるというオタクサウルスに同意します。これは多くの場合4Kです。

ブロックサイズを見つけたい場合stat -c "%o" filenameは、おそらく最も簡単なオプションです。

しかし、あなたが言うdd bs=4K、それはそれが意味するread(4096); write(4096); read(4096); write(4096)...

各システムコールには、いくらかのオーバーヘッドを伴うコンテキストスイッチが含まれ、I / Oスケジューラによっては、散在書き込みによる読み取りにより、ディスクが大量のシークを行う可能性があります。(おそらくLinuxスケジューラーの大きな問題ではありませんが、それでも考慮すべき点があります。)

その場合bs=8K、書き込みを行う(または別のプロセスのI / Oを提供する)他の場所を探す前に、ディスクが一度に2つのブロックを読み取ることを許可します。

その論理により、bs=16Kさらに良い、など。

したがって、パフォーマンスが悪化し始める上限があるかどうか、またはメモリによってのみ制限されているかどうかを知りたいと思います。


4
プロフィール、推測しないでください!
ジル

1
Linux Programming Interfaceは私に同意します。第13章-ファイルI / Oバッファリングを参照してください。
ミケル

4
興味深いことに、彼らのベンチマークは、4Kを超える利点はほとんどないことを示唆しています。
ミケル

4
また、明らかにデフォルトのファイル先読みウィンドウは128 KBであるため、この値が有益な場合があります。
ミケル

6
私は、BSが= 8Kは197メガバイト/ sの私を取得ここ24ドライブRAID50へのアクセスが、BS = 1Mは私に2.2取得する必要がありGB / sの RAIDの理論上のスループットに近いです。そのため、bsは重要です。ただし、bs = 10Mを使用すると、1.7GB / sしか得られません。そのため、あるしきい値を超えると悪化するように見えますが、理由はわかりません。
ジョセフガービン

5

ジルが言うように、ベンチマークすることで、ddに対するbsオプションの最適なパラメーターを決定できます。しかし、これは疑問を投げかけます:このパラメーターをどのように便利にベンチマークできますか?

この質問に対する私の暫定的な答えは、dd-optを使用することです。これは、この問題を正確に解決するために最近作業を開始したユーティリティです。


1
出力の感度はどのくらいですか?90-95%または> 95%?変更できるとは思いません。
レオレオポルトヘルツ준영

1
@Masi、私はdd-opt長い間取り組んでいないのではないかと心配しています。ただし、AGPLv3の下でライセンスされるフリーソフトウェアです。したがって、自由に改善して、その感度/精度を評価してください!
サンパブロクパー

0

私は、SDカードリーダーusb2.0用に最適化しましたbs=10M。8〜10Mの改善なしで、最大16Mで4kを試しました。転送速度の測定値がどのように低下​​するかを確認できます。ほとんどの場合、デバイスにバッファをロードし、デバイスが実際のメディアに転送されるのを待っているためです。

angstrom/sdcard# dd if=/dev/zero of=/dev/sdb bs=10M
123+0 records in
123+0 records out
1289748480 bytes (1.3 GB) copied, 21.4684 s, 60.1 MB/s
341+0 records in
341+0 records out
3575644160 bytes (3.6 GB) copied, 117.636 s, 30.4 MB/s
816+0 records in
816+0 records out
8556380160 bytes (8.6 GB) copied, 326.588 s, 26.2 MB/s
955+0 records in
955+0 records out
10013900800 bytes (10 GB) copied, 387.456 s, 25.8 MB/s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.