天天看点

ZFS deduplicate

前一篇blog介绍了zfs的压缩特性, 本文将介绍一下zfs的另一个特性deduplicate, 同compress的目标差不多, 都是节约存储空间的.

但是deduplicate带来的副作用会比较明显, 同时deduplicate的数据不是atomic事务写入的, 可能导致数据损坏. 一般不建议开启dedup.

deduplicate分3种粒度: 文件, 数据块, 字节.

文件的粒度最粗, 只有当一个文件的所有字节都完全一致时, 只需要存储1个文件的数据,  因为文件中任何一个字节改变, 都会导致无法利用deduplicate.

数据块级别的deduplicate显然比文件级别的好用, 但是数据块级别的dedup, 需要一个内存区域来跟踪共享数据块(即唯一的块, 假设10个数据块同样, 那么只需要1个共享数据块). 每个共享数据块需要耗费320字节来跟踪, 具体有多少个数据块可以通过zdb来查看.

具体需要多少内存的话可以计算(和实际存储的唯一数据块的个数有关, 但是最多需要多少内存则直接使用zpool占用的块数计算), 因为zfs还需要耗费大量的内存用作arc, 所以能给zfs dedup跟踪的内存必须减去一些必要的内存 : 

在有二级缓存的情况下, dedup block级别可以有更好的发挥. 因为如果内存不够的话, dedup带来的性能下降会非常明显.

以下是dedup的测试 :

注意avail没有变化, 说明deduplicate起到作用了, used显示的是使用的空间, 实际上是假的. 因为存储池也"放大"了.

可能是我这里的配置问题, zdb无法使用 : 

生成这个默认的配置, 当然也可以写在其他位置. 然后就可以正常使用zdb了.

[参考]1. https://pthree.org/2012/12/18/zfs-administration-part-xi-compression-and-deduplication/

2. http://blog.163.com/digoal@126/blog/static/16387704020144197501438/