为什么我的 rsync 不允许块大小>128K?

为什么我的 rsync 不允许块大小>128K?

使用大* --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使用了更高的值,为什么这对我不起作用?

*我正在使用较大的块大小,因为我正在尝试解决 rsync 将 CPU 永远旋转 44% 到 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)和131072(128k)。


更改已在版本中进行v3.0.0和支持OLD_v3.0.3中添加。 (链接解释了这些更改背后的一些基本原理。)

  • [PATCH] 一个补丁,尝试使真正的大文件得到处理,而不会陷入发送方哈希表搜索的困境。

  • [PATCH] 通过处理协议 < 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());

相关内容