我想知道激活 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
提前致谢。
您应该查看此直方图的两件事。第一个也是最明显的一个是
dedup
它末尾的表达式。没什么好说的,因为它是简单的数学。在您的情况下,重复数据删除只会节省 2% 的空间,并且由于您不使用压缩(首先应该这样做,因为它可以节省空间并提高性能,因为 I/O 比 CPU 时间成本高得多)像 LZ4 这样的高效算法,这是启用重复数据删除后的边际收益:2~3%。当有效空间节省高于 2.0 并且您的存储子系统非常昂贵时,重复数据删除开始变得有价值,以至于内存和 CPU 都可以浪费在处理重复数据删除上。例如,我们谈论的是企业 NVMe 池。
但这要付出什么代价呢?
这是我提到的第二件事。第一个命中将在您的 RAM 中。您需要将重复数据删除表存储在 RAM 上。如果没有 RAM 来保存它,系统就会崩溃,您将无法挂载池。较新版本的 ZFS(如 OpenZFS 2.0)有一些进步,但我不知道这方面是否有任何变化。
考虑到这一点,您只需获得块的总数,即第一列的最后一行:
49.6M
由于每个 dedup 表需要 320 字节,您只需将块数乘以给定 dedup 表所需的空间,您将获得所需的 RAM 量:
因此,您将浪费近16GB的系统 RAM 来对非重复数据删除友好的数据进行重复数据删除。这 16GB 将从系统的重要部分(如 ARC)中删除,这只会加速您的池。
所以不行。重复数据删除不值得,除非: