Tại sao rsync của tôi không cho phép kích thước khối> 128K?


15

Chạy rsync với số lượng lớn * --block-size như thế này:

rsync -avvz --rsh 'ssh -c arcfour' --block-size 1048576 --inplace --progress example.com:/big.file /big.file

Tôi nhận được lỗi sau đây:

Invalid block length 1048576 [sender]

Cả hai đầu đang chạy 64 bit CentOS 6.4. Từ Googling tôi đã thấy --block-sizeđược sử dụng với giá trị cao hơn nhiều, tại sao điều này không hiệu quả với tôi?

* Tôi đang sử dụng kích thước khối lớn vì tôi đang cố gắng khắc phục lỗi trong đó rsync chỉ quay CPU mãi mãi 44% thành một tệp 300 GB

rsync 

Câu trả lời:


13

Từ nguồn :

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);
}

Ở đâu :

#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)
#define MAX_BLOCK_SIZE ((int32)1 << 17)

Đó là 536870912(512M) và 131072(128k) tương ứng.


Thay đổi được thực hiện trong phiên bản v3.0.0 và hỗ trợ cho OLD_đã được thêm vào trong v3.0.3 . (Liên kết giải thích một số lý do đằng sau những thay đổi.)

  • [PATCH] Một bản vá để cố gắng làm cho các tệp thực sự lớn được xử lý mà không bị sa lầy trong tìm kiếm hashtable phía người gửi.

  • [PATCH] Đã sửa lỗi gửi các tệp lớn với các phiên bản rsync cũ hơn bằng cách xử lý giới hạn kích thước khối cũ cho các giao thức <29.


1
Dường như vẫn còn một lỗi trong 3.0.x trong việc xử lý kích thước khối trong --dry-run. Một lệnh không có --dry-run có thể hoạt động, nhưng với nó vẫn dẫn đến thông báo "Độ dài khối không hợp lệ NNN [người gửi]".
— Paul Gear

Thật thú vị khi tôi vừa gặp phải sắc thái được đề cập bởi @PaulGear, hơn 3 năm sau và đây vẫn là một vấn đề trong Ubuntu 18 với? v3.1.2
— TonyG

3

Kích thước khối tối đa phụ thuộc vào phiên bản giao thức rsync.

Với phiên bản giao thức nhỏ hơn 30, tối đa 1 << 29là 536870912 byte (512M). Nhưng với giao thức phiên bản 30 trở lên, tối đa 1 << 17là 128k byte. Vì vậy, bạn sẽ cần sử dụng phiên bản cũ hơn nếu bạn muốn kích thước khối lớn hơn.

Nguồn: rsync.h

#define MAX_BLOCK_SIZE ((int32)1 << 17)

/* For compatibility with older rsyncs */
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)

Và: i.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());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.