2012年03月29日

ZFS(zfs-fuse)のデータ重複排除機能は美味しいか?

しばらく前からちらほらと目にしていたZFS(ストレージ仮想化技術)ですがデータ重複排除機能がどれだけ得するのか(美味しいのか)Ubuntuで簡単に検証してみることにしました。

zfs-linux

zfs-fuseのインストール


zfsは、ライセンスの問題上、LinuxカーネルにはマージされていないのでUbutnuではユーザ空間で動作するzfs-fuseを使って動作させます。
インストールは端末(ターミナル)から次のコマンドで行います。

$ sudo apt-get install zfs-fuse
 以下の特別パッケージがインストールされます:
   libaio1
 提案パッケージ:
   nfs-kernel-server kpartx
 以下のパッケージが新たにインストールされます:
   libaio1 zfs-fuse
 アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
 1,535 kB のアーカイブを取得する必要があります。
 この操作後に追加で 4,215 kB のディスク容量が消費されます。
 
 サービスの起動・停止は次のコマンド。

$ sudo /etc/init.d/zfs-fuse start
 * Starting zfs-fuse zfs-fuse                                                          [ OK ] 
 * Immunizing zfs-fuse against OOM kills and sendsigs signals...     [ OK ] 
 * Mounting ZFS filesystems...                                                     [ OK ] 
※停止はstop


zfsストレージ・プールの作成


zfsでは複数のストレージ(ディスク)をまとめて(プールして)仮想的に一つのファイル・システムとして取り扱います。
今回はUSB2.0のフラッシュ・ドライブ(TDK製)を使うので、まずはzfsプールに追加するフラッシュ・ドライブのデバイス・ファイルを探します。

$ ll /dev/disk/by-id/
 合計 0
 lrwxrwxrwx * ata-SanDisk_pSSD-P2_64GB_APZ102909005855 -> ../../sda
 lrwxrwxrwx * usb-Sony_USB_HS-SD_MMC_001DBABE306B-0:1 -> ../../sdd
 lrwxrwxrwx * usb-TDKMedia_USB_Device_07B71D07369094D5-0:0 -> ../../sdb
 lrwxrwxrwx * usb-TDKMedia_USB_Device_07B71D07369094D5-0:0-part1 -> ../../sdb1
 ・・・

FAT32でフォーマットしてあるのでパーティション(sdb1)も見えますが、プールにはsdb(デバイス)全体を登録します。
ちなみに、直接デバイス・ファイルを直接指定(/dev/***)する例を見ますが、USB機器を追加・抜き差しするとパスが変わってしまう可能性があるので、直接ではなく、/dev/disk/by-id, by-uuidで指定した方が良いですね。

それではzfspoolというプール名でプールを作成。

$ sudo zpool create zfspool -f /dev/disk/by-id/usb-TDKMedia_USB_Device_07B71D07369094D5-0:0
※削除は$ sudo zpool destroy zfspool

作成できたかdfコマンドで確認してみます(使っているのは4GBのフラッシュ・ドライブ)。

$ df -m
 Filesystem           1M-ブロック    使用   使用可 使用% マウント位置
 zfspool                       3749          1     3749    1%  /zfspool
※-mオプションでMバイト単位で表示。3749MBが総容量。

 続いて次のコマンドでpublicというzfsストレージを作成。

$ sudo zfs create zfspool/public
※パスの先頭にスラッシュ(”/”)は付けない。

今度はzfs listコマンドで確認してみましょう。

$ sudo zfs list
 NAME             USED  AVAIL  REFER  MOUNTPOINT
 zfspool          224K  3.66G    21K  /zfspool
 zfspool/public    21K  3.66G    21K  /zfspool/public

さあ、肝心の重複排除機能を次のコマンドで有効にします。

$ sudo zfs dedup=verify zfspool/public
 
debup(de depulication)が重複排除を示しますが、この指定にはon/verifyの2つがあります。
zfsはある単位でデータをハッシュ化(SHA256)し、他と同一か否かを判断しますが、onの場合だと、非常に低い割合で異なるものを一致していると判断してしまう(データの破損。これをコリジョンと呼びます)可能性があります。その確率は10の-77乗。より完全な整合性を求めたい場合は、厳密にバイト単位で比較するverifyを指定します(その分、性能は低下します)。
#もし、今重複排除がどのような状態になっているかを知りたい場合には$ sudo zfs get dedupで確認できます。

さあ、これで準備はできたのですが、sudoで作業してきた関係で/zfspool/publicという場所は管理者(root)が所有者になっており、このままだと何をするにもsudoが必要になってしまいます。
面倒なので所有者・所有グループを変更しましょう。
僕はnetbuffaloというユーザでログインしているので、次のコマンドで自アカウントを所有者・所有グループにします。

$ sudo chown $USER:$USER /zfspool/public

これで準備万端。


重複排除の動作確認


約30MBのファイルを用意し、/zfspool/publicにコピーしてみます。

$ cp 30m.zip /zfspool/public

ストレージの使用状況をdfコマンドで確認すると、

$ df -m
 Filesystem       1M-ブロック    使用   使用可 使用% マウント位置
 zfspool/public        3749           30    3720    1% /zfspool/public
 
もちろん最初のコピーなのでとくに変化はないですね。
今度は同じファイルを名前を変えてコピー。

$ cp 30m.zip /zfspool/public/30-2.zip

同じく使用状況を見ると、おおー総容量(1M-ブロック値)が増えることで空き容量に殆ど変化がありません。

$ df -m
 Filesystem       1M-ブロック    使用   使用可 使用% マウント位置
 zfspool/public         3778          59    3719    2% /zfspool/public
 
使用量が増えないのではなく、総容量が増えるように見えるのですね。


読み込み・書き込み性能は?


厳密な分析をする時間も無いので、簡単に確認してみます。
約328MBのファイルを用意し、zfsストレージに保存してみます。

$ cp 328.mb /zfspool/public

要した時間は12分22秒(744秒)で平均すると約0.44MB/sec。僕のノートPC(VAIO VPCX119KJ)が非力なのも原因(特にCPU)かもしれませんが遅いですね。verifyではなくdedup=onならどうなるのでしょうか?onにして同じファイルをコピーしてみると、結果は12分38秒で逆に遅くなるぐらい。やっぱり僕のノートPC性能がボトルネックのようです。

今度は/zfspool/publicから別の場所にコピーしてみると、1回目が17秒(約19MB/sec)、2回目が10秒(約33MB/sec)と読み込みは比較的早く、キャッシュも効いているようです。


実際に重複排除はどれぐらい美味しいの?


まずは大きなサイズが手に入り易い動画ファイルで試してみました。
h264.comからサンプル動画ファイルをダウンロードします。

01

全部で911MBぐらいのファイルを集めて、zfsストレージにコピー。

スクリーンショット - 2012年03月28日 - 22時36分52秒

その結果は・・・

$ df -m
 Filesystem           1M-ブロック    使用   使用可 使用% マウント位置
 zfspool/public             3747       911      2836  25% /zfspool/public

総容量に変化なし(重複排除による利点なし)・ ・・。パソコンの電源を落として酒のんでフテ寝しましょうか・・。

そういう訳にはいかないので今度はファイルの数・種類が多いフォルダをコピーしてみます。
利用するのは僕のDropboxフォルダ。中には画像、動画、オフィス・ドキュメント(doc, xls, ppt)、テキスト・ファイルなど小さなファイルが2500ファイルほど存在し、総容量は772MBほど。

先程コピーした動画ファイルは全て削除し、Dropboxフォルダをまるごとコピーしてみます。

$ cp -pr ~/Dropbpx /zfspool/public

その結果は、、、

$ df -m
 Filesystem           1M-ブロック    使用   使用可 使用% マウント位置
 zfspool/public             3818       787     3031  21% /zfspool/public
 
今度は重複排除が効いてます!

単純計算すると、総容量が3818MB - 3747MBで71MB増えていますが、コピーした772MBに対して使用量は787MB(zfsの管理領域が+されている)なので、71 - (787 - 772) = 56MBだけ美味しい思いをしたようです。
率で考えると772MBに対して56MB重複排除が出たということは約7.2%のディスク節約となったといえます。

もし、1TBのディスクをzfsを使ってファイル・サーバとして利用したならば、72GB(1000000MB * 7.2%)得をすることになりそうです。
1TB使う人にとっては小さい数字にも見えるかもしれませんが、7%は大きいですよね。

今回利用したフォルダの中には重複した(同一の)ファイルも多数あったと思いますが、人による運用として自然に発生したものですから、素直に受け止めて良い数字だと思います。


ZFSをWindowsネットワークでファイル共有してみる


折角なのでSMBを使ってzfsストレージをファイル共有してみます。
まずは端末(ターミナル)から次のコマンドを実行。

$ sudo shares-admin

すると共有ツールの管理画面が表示され、共有ライブラリがない場合はインストールを促されます。

スクリーンショット - 2012年03月28日 - 15時46分30秒

SMBにチェックを入れてインストールを実行。

スクリーンショット - 2012年03月28日 - 15時47分02秒

インストールが終わったらユーザ・タブで共有ユーザを選択します。標準ではnobodyにチェックが付いているので、これを外して自分自身のユーザIDを選択し、パスワードを設定。

スクリーンショット - 2012年03月28日 - 15時51分21秒

続いてフォルダの共有・タブから共有するフォルダを選択します。

スクリーンショット - 2012年03月28日 - 15時48分36秒

フォルダ(P):は”その他”から作成したzfsストレージ(/zfspool/public)を選択。

スクリーンショット - 2012年03月28日 - 15時49分38秒

読み込み専用のチェックを外して、

スクリーンショット - 2012年03月28日 - 15時50分00秒

共有ボタンを押して完了。

スクリーンショット - 2012年03月28日 - 15時56分13秒

Windows PCからアクセスしてみると、

17

接続できました!

37


もちろん書き込みもOK。

zfsであればもしディスクの容量が残り少くなった場合にも

$ sudo zpool add zfspool /dev/disk/by-id/****

とプールに2台目の物理デバイスを追加するだけで良いので楽ですね。


ZFS 仮想化されたファイルシステムの徹底活用
長原 宏治 佐藤 通敏 今井 悟志 加藤 久慶 
アスキー・メディアワークス 
売り上げランキング: 340283



Posted by netbuffalo at 00:11│Comments(0)TrackBack(0)Linux 


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/3922045

コメントする

名前
URL
 
  絵文字