次のようにbig *を --block-size
使用してrsyncを実行します。
rsync -avvz --rsh 'ssh -c arcfour' --block-size 1048576 --inplace --progress example.com:/big.file /big.file
次のエラーが発生します。
Invalid block length 1048576 [sender]
どちらも64ビットCentOS 6.4を実行しています。インターネット検索で--block-size
より高い値が使用されていることを確認しましたが、これが私に適していないのはなぜですか?
*CPUを44%永遠に回転させるrsyncのバグを300GBファイルに修正しようとしているので、より大きなブロックサイズを使用しています。
答え1
~から源泉:
int32 max_blength = protocol_version < 30 ? OLD_MAX_BLOCK_SIZE : MAX_BLOCK_SIZE;
sum->blength = read_int(f);
if (sum->blength < 0 || sum->blength > max_blength) {
rprintf(FERROR, "Invalid block length %ld [%s]\n",
(long)sum->blength, who_am_i());
exit_cleanup(RERR_PROTOCOL);
}
どこ:
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)
#define MAX_BLOCK_SIZE ((int32)1 << 17)
それぞれ536870912
(512M)と(128k)です131072
。
バージョンが変更されました。v3.0.0そしてサポートOLD_
はv3.0.3に追加されました。 (リンクでは、これらの変更のいくつかの理論的根拠について説明します。)
[パッチ]送信者ハッシュテーブル検索で輻輳せずに処理する大容量ファイルをインポートするためのパッチです。
[パッチ] プロトコルのレガシーブロックサイズ制限<29を処理し、以前のrsyncバージョンを使用して大容量ファイルを転送するときに発生する問題を修正しました。
答え2
最大ブロックサイズはrsyncプロトコルのバージョンによって異なります。
プロトコルバージョンが30未満の場合、最大値は1 << 29
536870912バイト(512M)です。ただし、プロトコルバージョン30以降では、最大値は1 << 17
128kバイトです。したがって、より大きなブロックサイズが必要な場合は、以前のバージョンを使用する必要があります。
源泉:rsync.h
#define MAX_BLOCK_SIZE ((int32)1 << 17)
/* For compatibility with older rsyncs */
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)
そして:io.c
// ...
int32 max_blength = protocol_version < 30 ? OLD_MAX_BLOCK_SIZE : MAX_BLOCK_SIZE;
// ...
if (sum->blength < 0 || sum->blength > max_blength) {
rprintf(FERROR, "Invalid block length %ld [%s]\n",
(long)sum->blength, who_am_i());