文章
服务器与存储管理
2011 年 11 月
作者:Dominic Kay
在 Oracle Solaris 11 中,可以使用重复数据删除 (dedup) 属性删除 ZFS 文件系统中的冗余数据。如果文件系统已启用 dedup 属性,在将数据块写入磁盘时将删除重复的数据块。结果是磁盘上只存储独一无二的数据,文件之间共享共同的组成部分,如图 1 所示。
|

图 1. 磁盘上仅存储独一无二的数据
有些情况下,这可以极大地节省磁盘空间使用和成本。如下所示,可以轻松地对文件系统启用重复数据删除:
# zfs set dedup=on mypool/myfs
对于某些类型的数据(如虚拟机映像),重复数据删除可带来相当大的存储空间节省。而其他类型的数据(如文本)使用数据压缩时的存储效率可能更高,在 ZFS 中也可以使用数据压缩。
开始使用重复数据删除之前,需要分析以下两个问题:
以下提供了对这两个问题的分析指导。
要确定数据是否会受益于重复数据删除带来的空间节省,可使用 ZFS 调试工具 zdb。如果数据“不可进行重复数据删除”,那么启用 dedup 就没有意义。
重复数据删除使用校验和来执行。如果某个块与一个已写入池中的块具有相同的校验和,则认为该块是重复块,只需将一个指向已存储块的指针写入磁盘。
因此,尝试对不可进行重复数据删除的数据执行重复数据删除只会浪费 CPU 资源。ZFS 中的重复数据删除是带内操作。重复数据删除发生在写入磁盘时。此时将会产生(多余的)CPU 负载。
例如,如果估计的重复数据删除率大于 2,您可能会看到重复数据删除带来空间节省。在清单 1 所示的示例中,重复数据删除率小于 2,因此不建议启用 dedup。
# zdb -S tank
Simulated DDT histogram:
bucket allocated referenced
refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
------ ------ ----- ----- ----- ------ ----- ----- -----
1 2.27M 239G 188G 194G 2.27M 239G 188G 194G
2 327K 34.3G 27.8G 28.1G 698K 73.3G 59.2G 59.9G
4 30.1K 2.91G 2.10G 2.11G 152K 14.9G 10.6G 10.6G
8 7.73K 691M 529M 529M 74.5K 6.25G 4.79G 4.80G
16 673 43.7M 25.8M 25.9M 13.1K 822M 492M 494M
32 197 12.3M 7.02M 7.03M 7.66K 480M 269M 270M
64 47 1.27M 626K 626K 3.86K 103M 51.2M 51.2M
128 22 908K 250K 251K 3.71K 150M 40.3M 40.3M
256 7 302K 48K 53.7K 2.27K 88.6M 17.3M 19.5M
512 4 131K 7.50K 7.75K 2.74K 102M 5.62M 5.79M
2K 1 2K 2K 2K 3.23K 6.47M 6.47M 6.47M
8K 1 128K 5K 5K 13.9K 1.74G 69.5M 69.5M
Total 2.63M 277G 218G 225G 3.22M 337G 263G 270G
dedup = 1.20, compress = 1.28, copies = 1.03,
dedup * compress / copies = 1.50
之所以要回答此问题,是因为重复数据删除表会占用内存,最终会溢出以至于占用磁盘空间。此时,ZFS 将不得不为尝试进行重复数据删除的每个数据块执行额外的读写操作。这将导致性能下降。
而且,如果您没有察觉重复数据删除处于活动状态并可能造成负面效应,将难以确定性能下降的原因。池很大但内存区域很小的系统执行重复数据删除的性能不好。如果系统不满足内存要求,有些操作(如删除启用了 dedup 的大型文件系统)会严重降低系统性能。
可以通过如下方法计算出内存要求:
下面的示例使用清单 1 中 zdb 信息中的数据:
核内 DDT 大小 (2.63M) x 320 = 需要 841.60M 内存
对重复数据删除的两个约束条件(重复数据删除率和内存要求)进行评估之后,可以确定是否执行重复数据删除以及可能产生的空间节省。
下面是其他一些资源:
| 修订版 1.0,2011 年 11 月 8 日 |