USBフラッシュドライブへのdd書き込みにより大量の読み取りが発生する

USBフラッシュドライブへのdd書き込みにより大量の読み取りが発生する

現在、以前作成した dd イメージを使用して USB スティックを復元しています。ただし、スティックの書き込み速度は通常ははるかに速いのですが、書き込み速度が約 7 MB/秒と非常に遅いことがわかりました。

少し調べてみると、USB ドライブから大量のデータが読み取られており、書き込みパフォーマンスが低下していることに気付きました。その時点では、dd 以外は何もデバイスにアクセスしていません。

編集されたatop行:

sdd: busy 101% | read 18020 | write 613 | MBr/s 7.04 | MBw/s 7.1

dd を使用して md アレイに直接書き込むときにも同様の動作に気付きました。ただし、dd を使用してマウントされたファイルシステムに書き込む場合は、この現象は発生しません。

私の質問は、ブロック デバイスに直接書き込むときに USB スティックから読み取られるのはなぜか、また、書き込みパフォーマンスを向上させるためにこれを防ぐことができるかどうかです。

答え1

つまり、何が起こっているのか 100% 明確ではありませんが、USB に小さなブロック (512 バイト) を書き込み、その後 dd がバイトが適切に書き込まれたかどうかをチェックし、大量の読み取りと書き込み、また読み取りと書き込みが発生するのではないかと思います。

ブロック サイズを「適切な」サイズに調整するのは簡単ではありませんが、調整方法に関する経験則がいくつかあります。一般的に、64kB のブロック サイズはほとんどの面で適切な妥協点であることがわかりましたが、特殊なもの (たとえばzfs、など) を実行している場合は、ファイル システムによって変更される可能性があります。

次のようなことを試してください: lbzcat image-dd.bz2 | dd of=/deb/sdX bs=64k

より詳しい議論については、この郵便受け

答え2

私の場合、ddデフォルトでページ キャッシュを使用します。これは、ページ キャッシュを備えたシステムでは正常だと思います。ただし、ページ キャッシュではストレージ デバイスを読み取る必要があるため、書き込み速度が遅くなる可能性があります。

私にとって、これを回避してフルスピードを実現する方法は 3 つあります。

  1. ddブロック サイズを 4096 またはその倍数に設定します。(読み取りなし)
  2. ブロック サイズを十分に大きな数値に設定しますdd。私の場合は、約 100 万以上でした。約 100 万でフル スピードが得られました。(読み取りは非常に少ない)
  3. ddパラメータを指定してページ キャッシュを使用しないようにしますoflags=directddブロック サイズを 512 の十分に大きい倍数に設定します。私の場合は、約bs=120kとそれ以上でした。(読み取りなし)

私のシステムで注意すべき点ブロックサイズすべてのストレージデバイスとページサイズ4096 バイトです。以下で見つかりました:

blockdev --getbsz /dev/sd?
getconf PAGESIZE

またセクターサイズ512 バイトです。 セクター サイズもわかるfdiskかもしれません。parted

関連情報