私の問題はrsyncが増分転送を実行しない理由質問。
まず、1GBファイルを作成し、/target
rsyncを使用してフォルダに転送します。後でdoo
ファイルの末尾に s 文字列を追加しました。同じファイルを/target
フォルダに転送したときに、更新された部分だけではなくファイル全体が転送されたことがわかりました。
[尋ねる]rsyncがファイルの更新された部分のみを増分転送するように強制するにはどうすればよいですか?可能ですか、それともファイル全体を再送信する唯一のオプションですか?
例:
$ mkdir target
$ fallocate -l 1G target/temp_1GB_file
$ rsync --inplace --no-whole-file --size-only --progress temp_1GB_file doo
temp_10GB_file
1073741824 100% 227.30MB/s 0:00:04 (xfer#1, to-check=0/1)
sent 131163 bytes received 229425 bytes 48078.40 bytes/sec
total size is 1073741824 speedup is 2977.75
$ echo 'doo' >> temp_10GB_file
$ rsync --no-whole-file --size-only --progress temp_1GB_file doo # Here complete file has been transferred all over again.
temp_10GB_file
1073741828 100% 226.44MB/s 0:00:04 (xfer#1, to-check=0/1)
sent 131171 bytes received 229418 bytes 48078.53 bytes/sec
total size is 1073741828 speedup is 2977.74
答え1
ファイル全体を転送するわけではありません。
sent 131171 bytes received 229418 bytes 48078.53 bytes/sec
total size is 1073741828 speedup is 2977.74
詳細出力は、2回目の呼び出しでファイルの一部のみが送信されたことを示していますrsync
。
rsync
送信者のサブプロセスと受信者のサブプロセスが開始され、これらのサブプロセスはチェックサムとデータをやり取りします。
rsync
チェックサム彫刻ファイル。デフォルトでは、ブロックサイズはファイルサイズによって異なります。送信側と受信側のブロックチェックサムが一致しない場合、ブロック全体が送信されます。最後のブロックは文字列を追加することで変更されたため、送信する必要がありました。そのため、ファイル内で実際に変更されたバイト数ではなく、131171バイトが転送されるようにマークされます(この特定のファイルのブロックサイズは約130KBです)。
-B
マニュアルのオプションも参照してくださいrsync
。
答え2
ファイル全体を転送せずにソースファイルとターゲットファイル全体を読み、違いを確認します。
--no-whole-file
単純な「ファイル全体をコピーしてファイルを置き換える」を、より複雑な「ソース読み取りとチェックサムの計算、ターゲットの読み取りとチェックサムの計算、違いの更新」と交換します。
ここにあるシステムでは、2番目のタスクを実行するのは元のタスクを上書きするよりも時間がかかります。 (複数回試した後、時間は約+/-3秒ほど変わりました。)
- 29秒で元のコピー
- ソースをコピーして更新するためのデフォルト値は28秒です。
--whole-file
- 更新されたソースを比較してコピーするために59秒
--no-whole-file
rsync
時々、デルタ転送アルゴリズムを使用しない(妥当な)理由があります。