web-dev-qa-db-ja.com

rsyncがローカルファイルにデルタ転送を使用しないのはなぜですか?

スペースリザベーションがオンになっているトレントクライアントによって現在ダウンロードされている大きなisoイメージがあります。つまり、(4 Mib)の一部のチャンクはダウンロードのために常に変化していますが、ファイルサイズは変化していません。

90%のダウンロードで、後で時間を節約するために最初のrsyncを実行します。

 $ rsync -Ph DVD.iso /media/another-hdd/
sending incremental file list 
 
 DVD.iso 
 2.60G 100% 40.23MB/s 0:01:01(xfer#1、to-check = 0/1)
 
送信2.60Gバイト受信73バイト34.59Mバイト/秒
合計サイズは2.60Gスピードアップは1.00 
です

次に、ファイルが完全にダウンロードされたら、もう一度rsyncを実行します。

total size is 2.60G   speedup is 1.00

Speedup = 1は、デルタ転送が使用されなかったことを示しますが、ファイルの90%は変更されていませんが、ターゲットディレクトリは別のFSであり、コピーには数分かかります。なぜ高速化を試みないのですか?転送?!どのようにrsyncに強制的にデルタ転送を使用させることができますか?

26
kolypto

manpage によると、psusiは正しいです:

-W、-whole-file:ソースと宛先のマシン間の帯域幅がディスクへの帯域幅(特に「ディスク」が実際にネットワーク化されたファイルシステムである場合)。これは、ソースと宛先の両方がローカルパスとして指定されている場合のデフォルトですが、有効なバッチ書き込みオプションがない場合のみです。

21
liganic

この質問に対する簡単な答えは次のとおりです。

--no-Wフラグを使用して、ローカルまたはリモートに関係なく、デルタ圧縮を強制します。

更新:ストーリーにはまだまだあるようです。 delta compressionは、rsyncの受信プロセスと送信プロセスの間でのみ有効になっているようです。ファイルをファイルシステムに出力するとき、rsyncは、デルタ圧縮がオンになっていても、ファイル全体を書き出す場合があります。

「和漢短歌」の調査 こちら をご覧ください。

Update 2:--inplaceオプションは、ファイルの変更された部分のみを書き込みます。ただし、宛先ファイルが使用されている場合は、--sparseと競合し、マニュアルでは推奨されないことに注意してください。

18
HRJ

デフォルトでは、さまざまな安全上の理由から、rsyncは最初にターゲットファイルの新しいコピーを作成し、次にそれを置き換えます。 --inplace--no-whole-fileとともに指定することで、これをオーバーライドできます。これは、rsyncにターゲットファイルのインプレース編集を行うように指示し、manページに記載されているさまざまなリスク(通常、この状況では軽微)を受け入れます。

4
kartik_subbarao

デフォルトでは、rsyncは宛先にファイルのコピーを作成し、元のファイルを新しいコピーでアトミックに置き換えます。これは安全上の理由から行われます。あなたが探しているのは--inplaceオプション。これにより、rsyncは、ソースに対して変更された宛先ファイルの部分のみを変更します。

O.Pのユースケースでは、事前割り当てもオフにすることをお勧めします。これにより、スパースコピーを同期できるようになり、処理速度が大幅に向上します。ダウンロードの場合、VFATなどの非常に古いファイルシステムを使用している場合を除き、断片化について心配する必要はありません。特にメディアファイルは、ストレージメディアの最大パフォーマンスでは読み取られないため、それらをデフラグすることは無駄な作業です。

ダウンロードディレクトリを目的のボリュームにまばらにコピーするには、次のフラグと操作をこの順序でお勧めします。

rsync --ignore-existing -vxaHAXS /source /destination
rsync --inplace -vxaHAX /source /destination

最初のパスは新しいファイルを宛先にまばらにコピーします2番目のパスは既存のファイルをインプレースで更新し、変更のみをコピーします

これはスパースでインプレースのデルタコピーを実行しているので、余分なIOを発生させることなく繰り返し実行できます。 20個のトレントを同時に実行している場合でも、宛先での書き込みを増幅したり、ソース/宛先ボリュームをスラッシュしたりすることはありません。

1
Wil