ZFS 块级重复数据删除如何适应可变块大小?

700*_*are 6 zfs filesystems deduplication block

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

...
删除哪些内容:文件、块或字节?
...
当整个文件被复制时,块级重复数据删除的开销比文件级重复数据删除略高,但与文件级重复数据删除不同,它可以非常好地处理块级数据,例如虚拟机映像。
...
ZFS 提供块级重复数据删除
...

根据维基百科的 ZFS 文章

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

我想确保我正确理解这一点。

假设压缩关闭

如果我随机填充了一个 1GB 的文件,那么我会写另一个相同的文件,除了中途,我更改了一个字节。该文件是否会被删除重复数据(除了已更改的字节块之外的所有内容?)

如果我写一个单字节文件,它会占用整整 128 KB 吗?如果没有,如果文件变长,块会变大吗?

如果一个文件占用两个 64 KB 的块(这会发生吗?),那么在占用一个 128 KB 的块后是否会删除相同的文件

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

Yav*_*sov 8

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

假设记录长度为 128k

如果我随机填充了一个 1GB 的文件,那么我会写另一个相同的文件,除了中途,我更改了一个字节。该文件是否会被删除重复数据(除了已更改的字节块之外的所有内容?)

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

如果我写一个单字节文件,它会占用整整 128 KB 吗?如果没有,如果文件变长,块会变大吗?

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

如果一个文件占用两个 64 KB 的块(这会发生吗?),那么在占用一个 128 KB 的块后是否会删除相同的文件

一个文件需要 128k 相同的文件将被重复数据删除

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

如果找到完全相同的块是

  • 稍微更正:对于小于记录大小的文件,ZFS 将写入精确大小的单个文件系统块(如果启用压缩,则为压缩大小)。重复数据删除对这些大小可变的文件系统块进行操作。 (4认同)