ZFS 块级重复数据删除如何与可变块大小配合?

ZFS 块级重复数据删除如何与可变块大小配合?

根据在 Google 上搜索“ZFS 重复数据删除”的第一个结果

...
要进行重复数据删除:文件、块还是字节?
...
当整个文件重复时,块级重复数据删除的开销比文件级重复数据删除略高,但与文件级重复数据删除不同,它可以非常好地处理块级数据(如虚拟机映像)。...
ZFS
提供块级重复数据删除
...

根据维基百科的 ZFS 文章

ZFS 使用可变大小的块,最大可达 128 千字节。当前可用的代码允许管理员调整使用的最大块大小,因为某些工作负载在大块情况下表现不佳。如果启用了数据压缩 (LZJB),则使用可变块大小。如果可以压缩一个块以适应较小的块大小,则在磁盘上使用较小的块大小以使用更少的存储空间并提高 IO 吞吐量(尽管压缩和解压缩操作会增加 CPU 使用率)。

我想确保我理解得正确。

假设压缩已关闭

如果我有一个随机填充的 1GB 文件,然后我写入第二个文件,该文件与前一个文件相同,但中间部分我更改了其中一个字节。该文件会被重复数据删除吗(除了更改的字节的块之外,其他部分都会被重复数据删除?)

如果我写入一个单字节文件,它会占用整整 128 千字节吗?如果不是,如果文件变长,块会变大吗?

如果一个文件占用两个 64 千字节的块(这会发生吗?),那么在占用单个 128 千字节的块后,相同的文件是否会被重复数据删除

如果文件被缩短,那么其部分块将被忽略,也许数据不会被重置为 0x00 字节。半使用块会被重复数据删除吗?

答案1

ZFS 重复数据删除针对块(记录长度)进行操作,它不知道/不关心文件。每个块都使用 sha256(默认情况下可更改)进行校验和。如果校验和与其他块匹配,它将仅引用相同的记录,并且不会写入新数据。使用 ZFS 进行重复数据删除的一个问题是校验和保存在内存中,因此大型池将需要大量内存。因此,您只应在使用大记录长度时应用重复数据删除

假设记录长度为 128k

如果我有一个随机填充的 1GB 文件,然后我写入第二个文件,该文件与前一个文件相同,但中间部分我更改了其中一个字节。该文件会被重复数据删除吗(除了更改的字节的块之外,其他部分都会被重复数据删除?)

是的,只有一个块不会重复。

如果我写入一个单字节文件,它会占用整整 128 千字节吗?如果不是,如果文件变长,块会变大吗?

将分配 128k,如果文件大小超过 128k,则会根据需要分配更多块。

如果一个文件占用两个 64 千字节的块(这会发生吗?),那么在占用单个 128 千字节的块后,相同的文件是否会被重复数据删除

一个文件将占用128k,同一个文件将被去重

如果文件被缩短,那么其部分块将被忽略,也许数据不会被重置为 0x00 字节。半使用块会被推断出来吗?

如果发现完全相同的区块,是

答案2

正如 Yavor 所提到的,ZFS 的可变大小块不应与随机可变大小分块混淆,后者也称为内容定义分块或 Rabin 指纹。这里是一次描述差异的简短谈话。

ZFS 使用静态但可配置的块大小。

相关内容