rsync 中的默认块大小是多少?
如果我在不提供--block-size
选项的情况下执行 rsync 那么块大小有什么用?
我在 Linux 平台上使用 rsync。
答案1
- 如果您
--block-size=BLOCKSIZE
在命令行上指定,则使用该块大小。 - 如果文件大小小于或等于 490,000 字节,则块大小设置为 700 字节。
- 如果文件大于 490,000 字节,则块大小将设置为文件大小的平方根(四舍五入为 8 的倍数),最大块大小取决于协议版本。
- 对于协议版本 <30,最大块大小为 536,870,912 (~536MB),而
- 对于协议版本 >=30,最大块大小为 131,072 (~131KB),这是更合理的。
- 对于 17GB 的文件(131KB 的平方),您将达到 131KB 的最大块大小。
因此,根据较新版本的rsync
,根据 中的定义,块大小范围在 700 字节到 131KB 之间。源代码常量。
答案2
从rsync
手册:
-B
,--block-size=BLOCKSIZE
这迫使 rsync 的增量传输算法中使用的块大小为固定值。通常根据要更新的每个文件的大小来选择。详细内容请参见技术报告。
技术报告可在以下网址获取:https://rsync.samba.org/tech_report/尽管它很旧并且没有详细介绍如何选择块大小,只是“S 的值在 500 到 1000 之间对于大多数用途来说都很好”(这些值不是代码中实际使用的值,请参阅以下)。
实际中的一些评论源代码显示文件大小的平方根用作块大小(四舍五入到 8 的倍数):
/*
* set (initialize) the size entries in the per-file sum_struct
* calculating dynamic block and checksum sizes.
*
* This is only called from generate_and_send_sums() but is a separate
* function to encapsulate the logic.
*
* The block size is a rounded square root of file length.
*
* The checksum size is determined according to:
* blocksum_bits = BLOCKSUM_BIAS + 2*log2(file_len) - log2(block_len)
* provided by Donovan Baarda which gives a probability of rsync
* algorithm corrupting data and falling back using the whole md4
* checksums.
*
* This might be made one of several selectable heuristics.
*/
static void sum_sizes_sqroot(struct sum_struct *sum, int64 len)
{
[...]
else {
blength = 0;
do {
blength |= c;
if (len < (int64)blength * blength)
blength &= ~c;
c >>= 1;
} while (c >= 8); /* round to multiple of 8 */
blength = MAX(blength, BLOCK_SIZE);
}
所选择的块大小与所使用的 Unix 类型无关。