web-dev-qa-db-ja.com

gzipを介した 'dd'のパイプ処理が直接コピーよりもはるかに速いのはなぜですか?

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

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

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

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

しかし今、私は1メガバイト/秒のネットワーク転送速度のようなものを得るので、10から20倍速い。これに気付いた後、私はいくつかのパスとファイルでこれをテストしましたが、それは常に同じでした。

パイプラインのddからgzipを使用すると、ストリームのバイト長が大幅に短縮されるのではなく、転送レートが大幅に向上するのはなぜですか?圧縮時のCPU消費量の増加により、転送速度のわずかな低下でさえも代わりに期待されていましたが、今私は二重のプラスを得ます。私は幸せではないというわけではありませんが、私はただ疑問に思っています。 ;)

79
Foo Bar

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

一方、gzipは、より大きなバッファでI/Oを行うのに十分スマートです。つまり、ネットワーク上の少数の大量書き込みです。

もっと大きなbs=パラメータを指定してddをもう一度試して、今度はそれがうまく機能するかどうかを確認できますか。

99
user319088

少し遅くなりますが、追加してもいいですか...

インタビューで私はかつて尋ねられたビットごとのデータをクローンするための最も早い方法と粗いもののどちらがdddc3ddの使用で答える( 国防総省は に資金を供給した。インタビュアーは、ddへのddのパイプがより効率的であることを確認しました。これは単に同時読み取り/書き込みまたはプログラマ用語でstdin/stdoutを許可します。

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

コングは正しいです。あなたはリモートホストに圧縮されていないディスクからブロックをストリーミングしています。あなたのネットワークインターフェース、ネットワーク、そしてあなたのリモートサーバーが制限です。まずDDのパフォーマンスを上げる必要があります。ディスクバッファメモリに合わせてbs =パラメータを指定すると、ディスクのパフォーマンスが最大になります。たとえば、bs = 32Mとします。これにより、gzipのバッファーがドライブバッファーからsataまたはsasのラインレートで一杯になります。ディスクはシーケンシャル転送に対してより傾斜し、スループットが向上します。 Gzipはデータをストリームに圧縮してあなたの場所に送ります。 NFSを使用している場合は、NFS転送が最小限に抑えられます。 SSHを使用している場合は、SSHのカプセル化と暗号化のオーバーヘッドが発生します。あなたがnetcatを使用するなら、あなたは頭上の暗号化を持っていません。

0
Robert

私はここであなたが言及している "転送速度"がddによって報告されていると思います。ddは実際には1秒間に10倍のデータ量を転送しているため、これは実際には意味があります !しかし、ddはネットワークを介して転送していません - そのジョブはgzipプロセスによって処理されています。

いくつかのコンテキスト:gzipは、内部バッファをクリアできるのと同じくらい速く入力パイプからデータを消費します。 gzipのバッファが空になる速度は、いくつかの要因によって異なります。

  • I/O書き込み帯域幅(ネットワークによってボトルネックになっており、一定のままです)
  • I/O読み取り帯域幅(最近のマシンのローカルディスクからの読み取りは1MB /秒よりはるかに高いため、ボトルネックになる可能性は低いです)
  • その圧縮率(私はあなたの10倍のスピードアップによっておよそ10%であると仮定します、あなたがログファイルまたはXMLのようなある種の非常に反復的なテキストを圧縮していることを示します)

したがって、この場合、ネットワークは100kB/sを処理でき、gzipは10:1前後でデータを圧縮しています(そしてCPUによってボトルネックにされていません)。これは、100kB/sを出力している間、gzip consume 1MB/sを消費でき、そして消費率はddが見ることができるものであることを意味します。

0
Tullo_x86