2012年5月14日月曜日

連載「ZFS on Linux」第3回~重複削除~

サイオステクノロジー 鎌田です。

前回からかなり間が空いてしまいました。今回は ZFS の機能の一つである、重複削除について見ていきます。本連載記事のバックナンバーはこちら。

ZFS の重複削除を簡単に言うと、同じデータのファイルが複数存在した場合、実データを1つだけ書き込み、論理的にファイルが複数存在しているように見せる機能です。重複判定はブロック単位で行われ、ブロック毎に chacksum を確認して重複しているかどうかが判定されます。

重複削除の設定方法は次の通りです。

# zfs set dedup=on zfspool/example

dedup には次の設定が行えます。

パラメータ名 簡単な説明
on 重複削除機能を有効にします。使用する checksum 方式は、その領域で設定している checksum の使います。
off 重複削除機能を無効にします。
verify sha256,verify と設定したことと同義です。
sha256[,verify] checksum に sha256 を使い、同じ checksum であった場合にバイト単位での比較を行い、重複確認を行います。

では、実際に重複削除が機能しているか確認してみます。dd コマンドを使って /dev/zero からファイルを作成します。

# dd if=/dev/zero of=data bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 18.0038 s, 59.6 MB/s

1GiB のファイルを作成してみました。ls コマンドと df コマンドで確認してみます。

# df -H
Filesystem             Size   Used  Avail Use% マウント位置
 :
zfspool/example         14G   1.1G    13G   8% /zfspool/example
# ll
合計 1048710
-rw-r--r-- 1 root root 1073741824  5月 14 15:57 2012 data

1GiB 分のファイルが作成されています。もう1つファイルを作成し、ls と df で確認してみます。

# ll
df合計 2093708
-rw-r--r-- 1 root root 1073741824  5月 14 15:57 2012 data
-rw-r--r-- 1 root root 1073741824  5月 14 15:58 2012 data1
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
 :
zfspool/example         15G   2.2G    13G  15% /zfspool/example

どうやら、重複削除が効いていないように見えます。このままどんどんファイルを作ってみます

# ll
合計 11535824
-rw-r--r-- 1 root root 1073741824  5月 14 15:57 2012 data
-rw-r--r-- 1 root root 1073741824  5月 14 15:58 2012 data1
-rw-r--r-- 1 root root 1073741824  5月 14 16:04 2012 data10
-rw-r--r-- 1 root root 1073741824  5月 14 16:00 2012 data2
-rw-r--r-- 1 root root 1073741824  5月 14 16:00 2012 data3
-rw-r--r-- 1 root root 1073741824  5月 14 16:01 2012 data4
-rw-r--r-- 1 root root 1073741824  5月 14 16:02 2012 data5
-rw-r--r-- 1 root root 1073741824  5月 14 16:02 2012 data6
-rw-r--r-- 1 root root 1073741824  5月 14 16:03 2012 data7
-rw-r--r-- 1 root root 1073741824  5月 14 16:03 2012 data8
-rw-r--r-- 1 root root 1073741824  5月 14 16:04 2012 data9
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
 :
zfspool/example         25G    12G    13G  49% /zfspool/example

なんと領域のサイズが増えました。いったいこれはどういうことなんでしょうか?実は、重複削除の確認には zpool コマンドを使う必要があります。

# zpool list zfspool
NAME      SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zfspool  11.9G  12.0M  11.9G     0%  90112.00x  ONLINE  -

DEDUP の値が重複削除を行った倍率を示しています。dedup が無効の場合、この値は 1.00x と表示されています。ALLOC の値を見ると、実際に記録されているデータ量は 12MB であることがわかります。

このように、重複削除を使うことで領域の容量を節約することができ、ストレージの最大容量を超えたデータを記録することが可能です。

0 件のコメント:

コメントを投稿