backup – なぜ gzip を通して ‘dd’ をパイピングすると直接コピーよりも速いのか?

backup dd gzip performance pipe

私はネットワーク内のコンピュータから同じネットワーク内の別のコンピュータへのパスを100Mbit/sの回線でバックアップしたいと思っていました。そのために私が行ったのは

dd if=/local/path of=/remote/path/in/local/network/backup.img

これで、ネットワークの転送速度が 50 から 100 kB/s 程度の非常に低いものになってしまいました、これは永遠にかかってしまうでしょう。そこで私はそれを止めて その場でそれをgzipで圧縮してみて 転送量が少なくなるように小さくしてみることにしましたで、やってみました

dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz

しかし、今では1MB/sのネットワーク転送速度のようなものを得ることができ、10~20倍速くなりました。これに気づいた後、いくつかのパスとファイルでテストしてみましたが、いつも同じでした

ddからgzipへのパイピングも、ストリームのbytelengthを大きく下げるだけではなく、転送レートを大きく上げるのはなぜだろうか。圧縮中のCPU消費量が増えるから、代わりに転送速度が少しでも下がることを期待していたのに、ダブルプラスになってしまった。満足しているわけではありませんが、気になっているだけです。 ; ; )。)

  81  Foo Bar  2014-05-29


ベストアンサー

ddは、デフォルトでは非常に小さなブロックサイズ — 512バイト(!!)を使用します。つまり、多くの小さな読み書きが行われます。最初の例でナイーブに使われていた dd は、非常に小さなペイロードで大量のネットワークパケットを生成し、スループットを低下させていたようです

一方、gzipは、より大きなバッファでI/Oを行うのが賢い。つまり、ネットワーク上での大きな書き込みの数が少ない

ddをもう一度bs=パラメータを大きくして試してみて、今度はうまくいくかどうか確認してみてはどうでしょうか?

100  None  2014-05-29


遅くなったけど、付け加えてもいいかな

インタビューの中で、ビット単位のデータを複製するための最も迅速な方法は何かと聞かれ、dddc3ddと答えたことがあります (DoD funded)。インタビュアーは、ddからddへのパイピングがより効率的であることを確認しています。これは、単純に同時のRead/Write、またはプログラマの用語ではstdin/stdoutを可能にするため、最終的には書き込み速度を2倍にし、転送時間を半分にすることができます

dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb

4  Get-Tek  2016-09-07


Congが正しいです。あなたはリモートホストに非圧縮ディスクからブロックをストリーミングしています。あなたのネットワークインターフェース、ネットワーク、リモートサーバーが限界です。最初にDDのパフォーマンスを上げる必要があります。ディスクのバッファメモリに合わせて bs= パラメータを指定すると、ディスクのパフォーマンスを最大限に引き出すことができます。例えば bs=32M とする。これにより、ドライブバッファから直接 sata または sas ラインレートで gzip のバッファが満たされる。これにより、ディスクはシーケンシャル転送に傾くことになり、より良いスループットが得られる。Gzipはストリームでデータを圧縮し、あなたの場所に送信します。あなたがNFSを使用している場合は、NFSの転送を最小限に抑えることができます。SSHを使用している場合は、SSHのカプセル化と暗号化のオーバヘッドを暗号化します。netcatを使用している場合は、頭上の暗号化はありません

0  Robert  2014-06-26


私はここで、あなたが言及している「転送速度」はddによって報告されていると仮定しています。なぜなら、ddは実際には毎秒10倍のデータ量を転送しているからです!しかし、ddはネットワーク経由で転送していません。しかし、ddはネットワーク経由で転送しているわけではなく、gzipプロセスが処理しています

いくつかのコンテキスト。gzip は、内部バッファをクリアできるだけの速さで入力パイプからデータを消費します。gzip のバッファが空になる速度は、いくつかの要因に依存します

  • I/O書き込み帯域幅(ネットワークがボトルネックになっていて、一定のままになっている)
  • I/Oの読み取り帯域幅(これは、現代のマシン上のローカルディスクからの読み取り1MB/秒よりもはるかに高くなるだろう、したがって、可能性の高いボトルネックではありません)
  • その圧縮率(私は、あなたがログファイルやXMLのようなある種の非常に永続性のあるテキストを圧縮していることを示す、約10%であることがあなたの10倍のスピードアップによって仮定されます)

この場合、ネットワークは100kB/sを扱うことができ、gzipはデータを10:1程度に圧縮しています(CPUによるボトルネックにはなっていません)。つまり、100kB/sを出力している間、gzipは1MB/sを消費することができ、その消費率はddの目に見えているということになります

0  Tullo_x86  2016-10-21


タイトルとURLをコピーしました