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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.