다음과 같이 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());