FreeBSD で ZFS を利用する – 重複排除を利用する・確認する

ZFS

今回は ZFS の大きな特徴の一つである,重複排除にフォーカスしたいと思います.
ZFS はファイルシステム (ZVOLも) の重複排除が利用できます.
これによってストレージ利用量の削減が見込めます.

重複排除とは

重複排除は,同一のデータが複数あった場合,ストレージ上には一つのデータのみを保持し,各データへのポインターを持つことでストレージ容量の節約をはかる技術です.

以下の図としては同じファイルが複数のフォルダーにあるイメージですが,実際としてはファイルの比較ではなく,ファイル内のデータを比較して重複排除の対象となります.

重複排除の有効化

ZFS の重複排除の有効化はファイルシステム/ZVOL 単位で zfs set で実施可能です.
以下は新規のファイルシステムを作成,そのファイルシステムに重複排除を有効化させる手順となります.

# zfs create pool0/dedup

# zfs set dedup=on pool0/dedup

# zfs get dedup pool0/dedup
NAME         PROPERTY  VALUE          SOURCE
pool0/dedup  dedup     on             local

重複排除の効果

重複排除の効果を測定するため,圧縮の際と同様に FreeBSD のソースコードを展開して状況を見てみたいと思います.
/pool0/dedup が作成されましたのでサブディレクトリーを作成して,その中にソースコードを展開し,使用量や重複排除の結果を確認してみます.

# mkdir /pool0/dedup/src1
# cd /pool0/dedup/src1
# tar jxf /root/src_stable_13.tar.xz

# df -H /pool0/dedup
Filesystem     Size    Used   Avail Capacity  Mounted on
pool0/dedup    412G    1.4G    410G     0%    /pool0/dedup

df の結果は本来の使用量が表示されます.重複排除の状態を確認するには zpool list コマンドを用いて確認となります.

# zpool list pool0
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   596G  2.02G   594G        -         -     0%     0%  1.01x    ONLINE  -

1.01x が現状の効果となり,ソースコードを1回展開した場合は 1% 程重複排除が効いている状態となります.

もう一度ソースコードを展開して,再度状況を確認してみます.

# mkdir /pool0/dedup/src2
# cd /pool0/dedup/src2
# tar jxf /root/src_stable_13.tar.xz

# df -H /pool0/dedup
Filesystem     Size    Used   Avail Capacity  Mounted on
pool0/dedup    413G    2.9G    410G     1%    /pool0/dedup

# zpool list pool0
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   596G  2.08G   594G        -         -     0%     0%  2.02x    ONLINE  -

いかがでしょうか.2.02x となり,まるっと重複排除対象として扱われている事が判ります.1.4GB 程展開してデータは増えていますが,FREE の値に変化がないためしっかりと効いている事が確認できます.

重複排除と圧縮の両方を有効にする

重複排除と圧縮は排他ではなく,両方を有効にすることができます.
ZSTD も有効にした形でどのような効果があるかを確認してみます.

# zfs create pool0/dedup-zstd

# zfs set dedup=on pool0/dedup-zstd
# zfs set compression=zstd pool0/dedup-zstd

# zfs get dedup pool0/dedup-zstd
NAME              PROPERTY  VALUE          SOURCE
pool0/dedup-zstd  dedup     on             local

# zfs get compression pool0/dedup-zstd
NAME              PROPERTY     VALUE           SOURCE
pool0/dedup-zstd  compression  zstd            local

重複排除と圧縮の効果

重複排除と圧縮の効果を測定するため,先ほどと同様に FreeBSD のソースコードを展開して状況を見てみたいと思います.
/pool0/dedup-zstd が作成されましたのでサブディレクトリーを作成して,その中にソースコードを展開し,使用量や重複排除の結果を確認してみます.

# mkdir /pool0/dedup-zstd/src1
# cd /pool0/dedup-zstd/src1
# tar jxf /root/src_stable_13.tar.xz

# df -H /pool0/dedup-zstd/src1
Filesystem          Size    Used   Avail Capacity  Mounted on
pool0/dedup-zstd    410G    444M    410G     0%    /pool0/dedup-zstd

Used が 先が 1.4G で今回が 444M ですので,まず圧縮が効いている事が確認できます.
zfs get と zpool list で ZFS としてどのように見えているのかを確認します.

# zfs get compressratio pool0/dedup-zstd
NAME              PROPERTY       VALUE  SOURCE
pool0/dedup-zstd  compressratio  3.44x  -

# zpool list pool0
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   596G  2.79G   593G        -         -     0%     0%  1.01x    ONLINE  -

圧縮が行われつつ,重複排除も効いている事が確認できました.
追加でソースコードを展開して変化を見てみます.

# mkdir /pool0/dedup-zstd/src2
# cd /pool0/dedup-zstd/src2
# tar jxf /root/src_stable_13.tar.xz

# df -H /pool0/dedup-zstd/src1
Filesystem          Size    Used   Avail Capacity  Mounted on
pool0/dedup-zstd    412G    889M    411G     0%    /pool0/dedup-zstd

# zpool list pool0
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   596G   758M   595G        -         -     0%     0%  2.03x    ONLINE  -

圧縮が効いているため,444M が二つ分となっています.
DEDUP が 2.03x ですのでまるっと重複排除対象になっています.また,圧縮が効いている効果で FREE の値が2回目が増えている状況です.

このように,両方を有効にすることでよりストレージの使用量を節約する事が可能です.

大事な注意点

このように非常に効果が見込まれる重複排除ですが,メモリーを大量に必要とする点を注意する必要があります.
大まかにですが,1TB の領域あたり,1GB のメモリーを使用します.これが不足する状況だとパフォーマンスが大きく劣化する事や重複排除自体の障害を引き起こす可能性があります.

したがって,4TB の領域がある場合,ARC の容量も含めてで ZFS に対して 8GB 程のメモリーを搭載している事が望ましいと考えられます.

実利用にあたっては,よくテストを行ったうえで利用する事をお勧めします.
実際に筆者環境においてはメモリー不足でトラブルとなった為頑張って無効のファイルシステムにデータを移行した経緯があります…
今はメモリーも十分なファイルサーバーとなったので改めて利用チャレンジを考えている所です.

以上,ZFS の重複排除の紹介でした.

コメント

タイトルとURLをコピーしました