web-dev-qa-db-ja.com

rawデバイスにSLOWを書き込み、ファイルシステム(USBキー)にFASTを書き込むのはなぜですか?

LinuxでQuick'n'Dirtyのベンチマークを試みているUSBキー( PQI U822V-Speedy 32G )を持っています。書き込み帯域幅をテストしています。

RAWパーティション上のdd

セクター2048で始まるパーティションを作成し、4GBのシーケンシャル書き込みを行いました。

dd if=/dev/zero of=/dev/sdb1 bs=1M count=4096

私は〜22MB /秒を取得します。

また、上記のように並行して実行されているいくつかのddを試しましたが、count=1024seek=オプションを使用してドライブのさまざまな領域に書き込みました。同じ結果。

ファイルシステム上のdd

ただし、sdb1パーティションをext4またはNTFSのいずれかでフォーマットし、大きなファイル(realまたは/dev/zero)を次のようにコピーすると、次のようになります。

time dd if=/dev/zero of=/media/USBKEY/file.bin bs=1M count=4096 ; time sync

メーカーの宣伝どおり、66 MB/s以上を達成しています。もちろん、コピー直後のsync期間を考慮しました。

なぜこんなに大きなパフォーマンスの違いがあるのですか?

7
Totor

もう一度見てみると、これはハードドライブではなくUSBキー(フラッシュドライブ)だとおっしゃっていました。フラッシュメモリは大きなブロックでのみ消去できます。個々のセクターは、最初にそれら(およびそれらが含まれているブロック全体)を消去せずに書き込むことはできません。ソフトウェアはいつでもディスク上の好きな場所に書き込むことができると想定しているため、ディスクには消去ロジックを透過的に処理するための変換ロジックがあります。これがどのように行われるかは、書き込みパフォーマンスに劇的な影響を及ぼします。多くのデバイスは、ほとんどのディスクにアルゴリズムを使用しており、シーケンシャル書き込みを非常にうまく処理しますが、ランダム書き込みでは問題が発生します。ディスクの先頭近くの領域は、通常、事前にフォーマットされたFATファイルシステムのFATによって使用され、この領域はランダムに頻繁に書き込まれるため、この領域では、順次書き込みでは低速ですが、そうではない別のアルゴリズムを使用します。ランダム書き込みでひどい。

したがって、コメントとして追加した私の最初の推測が正しかったことは、今やかなり確信しています。ファイルシステムに書き込むときに表示されるのは、残りのディスクのパフォーマンスです。オフセット0でddを実行すると、ファットエリアに書き込みます。 ddの宛先を数百MB求める場合は、かなり高速化するはずです。

1
psusi

代わりにhdparmを使用して、キャッシュを使用する場合と使用しない場合のドライブのパフォーマンスをベンチマークしてみてください。

$ Sudo hdparm -tT /dev/sda1

/dev/sda1:
 Timing cached reads:   6314 MB in  2.00 seconds = 3157.61 MB/sec
 Timing buffered disk reads: 244 MB in  3.04 seconds =  80.26 MB/sec
0
slm

測定結果は、カーネルアーキテクチャで説明できます。ファイルシステムアクセスを使用すると、カーネルが実行できるすべてのバッファと最適化により、カーネルの可能性が最大限に発揮されます。特にバッファはベンチマークを高速化します(b/cカーネルは100%a_A_syncronousです)。デバイスファイルのddは、これのいずれか/多くを使用しません。

0
Bananguin