我想知道激活 zfs 重复数据删除是否会给我带来任何好处,所以我运行了该命令,
zdb -S tank
但我知道我需要一些帮助来解释输出。
Simulated DDT histogram:
bucket allocated referenced
______ ______________________________ ______________________________
refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
------ ------ ----- ----- ----- ------ ----- ----- -----
1 49.2M 6.15T 6.15T 6.14T 49.2M 6.15T 6.15T 6.14T
2 352K 42.0G 42.0G 42.0G 725K 86.3G 86.3G 86.4G
4 7.99K 913M 913M 916M 37.7K 4.20G 4.20G 4.21G
8 1.43K 161M 161M 161M 14.6K 1.58G 1.58G 1.58G
16 623 67.1M 67.1M 67.4M 12.2K 1.32G 1.32G 1.33G
32 73 7.37M 7.37M 7.43M 2.65K 268M 268M 270M
64 717 4.23M 4.23M 7.46M 48.3K 392M 392M 611M
128 4 257K 257K 266K 689 40.9M 40.9M 42.6M
256 2 128K 128K 133K 802 57.8M 57.8M 59.3M
512 2 1K 1K 10.7K 1.37K 703K 703K 7.32M
4K 1 128K 128K 128K 7.31K 935M 935M 934M
16K 1 512B 512B 5.33K 20.0K 10.0M 10.0M 107M
64K 1 128K 128K 128K 93.0K 11.6G 11.6G 11.6G
512K 1 128K 128K 128K 712K 89.0G 89.0G 88.9G
Total 49.6M 6.19T 6.19T 6.18T 50.9M 6.34T 6.34T 6.33T
dedup = 1.02, compress = 1.00, copies = 1.00, dedup * compress / copies = 1.03
提前致谢。
答案1
您应该从两个方面来看待这个直方图。第一个也是最明显的是dedup
它末尾的表达式。由于这只是简单的数学运算,因此没什么好说的。在您的情况下,重复数据删除只能节省 2% 的空间,并且由于您不使用压缩(首先您应该使用压缩,因为它可以节省空间并提高性能,因为使用 LZ4 等高效算法,I/O 比 CPU 时间要昂贵得多),这就是启用重复数据删除后您将获得的边际收益:2~3%。
当有效空间节省高于 2.0 且存储子系统非常昂贵时,重复数据删除开始变得有价值,以至于内存和 CPU 被浪费来处理重复数据删除是可以的。例如,我们讨论的是企业 NVMe 池。
但这要付出什么代价呢?
这是我提到的第二件事。第一个命中将出现在您的 RAM 中。您需要将重复数据删除表存储在 RAM 上。如果没有 RAM 来保存它,系统就会崩溃,您将无法挂载池。较新版本的 ZFS(如 OpenZFS 2.0)有一些改进,但我不知道在这方面是否有任何变化。
考虑到这一点,您只需获得块的总数,即第一列的最后一行:49.6M
由于每个重复数据删除表需要 320 个字节,因此只需将块数乘以给定重复数据删除表所需的空间,即可获得所需的 RAM 量:
49.6M * 320 bytes = 15.872MB ~ 15.5GB
所以你会浪费几乎16 GB系统 RAM 只是为了对非重复数据进行重复数据删除。这 16GB 将从系统的重要部分(如 ARC)中删除,这只会加速您的池。
所以,不。重复数据删除不值得,除非:
- 您有极其昂贵的存储子系统
- 您的数据可以轻松进行重复数据删除