私のネットワーク内のコンピュータから同じネットワーク内の別のコンピュータへのパスを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消費量の増加により、転送速度のわずかな低下でさえも代わりに期待されていましたが、今私は二重のプラスを得ます。私は幸せではないというわけではありませんが、私はただ疑問に思っています。 ;)
dd
はデフォルトで非常に小さいブロックサイズ - 512バイト(!!)を使用します。つまり、小さな読み書きがたくさんあります。最初の例で単純に使用されていたdd
は、非常に小さいペイロードで大量のネットワークパケットを生成していたため、スループットが低下しているようです。
一方、gzip
は、より大きなバッファでI/Oを行うのに十分スマートです。つまり、ネットワーク上の少数の大量書き込みです。
もっと大きなbs=
パラメータを指定してdd
をもう一度試して、今度はそれがうまく機能するかどうかを確認できますか。
少し遅くなりますが、追加してもいいですか...
インタビューで私はかつて尋ねられたビットごとのデータをクローンするための最も早い方法と粗いもののどちらがdd
かdc3dd
の使用で答える( 国防総省は に資金を供給した。インタビュアーは、dd
へのdd
のパイプがより効率的であることを確認しました。これは単に同時読み取り/書き込みまたはプログラマ用語でstdin/stdout
を許可します。
dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb
コングは正しいです。あなたはリモートホストに圧縮されていないディスクからブロックをストリーミングしています。あなたのネットワークインターフェース、ネットワーク、そしてあなたのリモートサーバーが制限です。まずDDのパフォーマンスを上げる必要があります。ディスクバッファメモリに合わせてbs =パラメータを指定すると、ディスクのパフォーマンスが最大になります。たとえば、bs = 32Mとします。これにより、gzipのバッファーがドライブバッファーからsataまたはsasのラインレートで一杯になります。ディスクはシーケンシャル転送に対してより傾斜し、スループットが向上します。 Gzipはデータをストリームに圧縮してあなたの場所に送ります。 NFSを使用している場合は、NFS転送が最小限に抑えられます。 SSHを使用している場合は、SSHのカプセル化と暗号化のオーバーヘッドが発生します。あなたがnetcatを使用するなら、あなたは頭上の暗号化を持っていません。
私はここであなたが言及している "転送速度"がdd
によって報告されていると思います。dd
は実際には1秒間に10倍のデータ量を転送しているため、これは実際には意味があります !しかし、dd
はネットワークを介して転送していません - そのジョブはgzip
プロセスによって処理されています。
いくつかのコンテキスト:gzip
は、内部バッファをクリアできるのと同じくらい速く入力パイプからデータを消費します。 gzip
のバッファが空になる速度は、いくつかの要因によって異なります。
したがって、この場合、ネットワークは100kB/sを処理でき、gzip
は10:1前後でデータを圧縮しています(そしてCPUによってボトルネックにされていません)。これは、100kB/sを出力している間、gzip
は consume 1MB/sを消費でき、そして消費率はdd
が見ることができるものであることを意味します。