天天看點

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/