2008年 8月 26日 火曜日
やっぱり Sun がスキ!
ZFS でデータ圧縮
ZFS の機能について既にこのブログでもいくつも紹介していますが、 今回は圧縮機能にこだわってご紹介してみたいと思います。既にご存知の 方もおられると思いますが、ZFS の圧縮機能を使うとファイルシステムに 書き込んだファイルが自動的に圧縮されます。ただしファイルシステム レベルで行われるため、ディスク上の領域を節約する一方、ユーザや アプリケーションは非圧縮の場合と差異無く利用できるようになっています。 圧縮アルゴリズムには、ZFS 用に開発された LZJB アルゴリズムと GZIP アルゴリズムが利用できます ( GZIP は現在はまだ OpenSolaris / Solaris Express が必要です)。さらに注目すべきは、この圧縮処理が並列化されて おり、UltraSPARC T2 など CMT プロセッサで極めて高い性能を実現している ことです。処理性能については後でもう少しご紹介します。
利用方法は ZFS の他の機能に違わず極めてシンプルになっていて、 以下のようにファイルシステム作成オプションまたは既存のファイル システムの属性変更で compression= on | lzjb | gzip | gzip-[1-9] と指定するだけです。
例1) ファイルシステム作成時に圧縮モードを指定します。
# zfs create -o compression=gzip mypool/comp1 # zfs get compression NAME PROPERTY VALUE SOURCE mypool compression off default mypool/comp1 compression gzip local
例2) 非圧縮で作成したファイルシステムを圧縮モードに変更します。 既に非圧縮で存在するファイルはそのままで、モード変更後に書き込ま れるファイルから圧縮されるようになります。
# zfs set compression=gzip-2 mypool/comp2 # zfs get compression NAME PROPERTY VALUE SOURCE mypool compression off default mypool/comp1 compression gzip local mypool/comp2 compression gzip-2 local
では実際に書き込んでみます。
# cp /tmp/SunStudio12-solaris-sparc-200705-pkg.tar /mypool/comp1
ファイルサイズは当然変わりませんが...
# ls -l total 1987005 -rw-r--r-- 1 root root 1536598016 Aug 20 08:20 SunStudio12-solaris-sparc-200705-pkg.tar
ディスク上では圧縮されていることが分かります。
# zfs list NAME USED AVAIL REFER MOUNTPOINT mypool 970M 77.3G 21K /mypool mypool/comp1 970M 77.3G 970M /mypool/comp1 mypool/comp2 18K 77.3G 18K /mypool/comp2 # # zfs get compressratio NAME PROPERTY VALUE SOURCE mypool compressratio 1.49x - mypool/comp1 compressratio 1.49x - mypool/comp2 compressratio 1.00x -
では圧縮速度を見てみましょう。 最新の UltraSPARC T2+ (1165MHz) で試してみます。ただし、64 番以降のスレッドは offline にして います。
# timex cp /tmp/SunStudio12-solaris-sparc-200705-pkg.tar /mypool/comp1; timex sync real 1:37.78 user 0.00 sys 6.71 real 3.53 user 0.00 sys 0.12
ファイルサイズは 1536598016 バイトなので、書き込み速度は 14.46 MB/s となります。また vmstat で CPU 使用率をみるとおよそ usr 0% / sys 12% でした。64 スレッドの 12% なので、およそ 8 つの スレッドが 100% で並列圧縮を行っているイメージとなります。
# vmstat 4 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr rm s0 s1 s2 in sy cs us sy id 0 0 0 1252200 1615352 1 4097 0 0 0 0 0 0 96 100 0 1041 216 789 0 12 88 0 0 0 1252176 1615320 0 5120 0 0 0 0 0 0 97 95 0 991 200 736 0 12 87 0 0 0 1252152 1615296 1 1281 0 0 0 0 0 0 89 89 0 969 211 694 0 13 87 0 0 0 1252104 1615256 1 3329 0 0 0 0 0 0 94 92 0 999 202 733 0 12 88
ちなみにスレッド数を最大の 128 にしても結果はほぼ同じでした。 ファイル圧縮で際限なく CPU を使わないよう自制しているようです。 ただ逆にスレッド数を 24 まで減らすと数秒遅くなりました。
それで、この性能がどの程度のものなのか、試しに AMD Opteron 1.8GHz (dualcore) 搭載のマシンを使って同じファイルを gzip コマンド (並列化 未対応です) で圧縮し、時間を計ってみました。
# timex gzip SunStudio12-solaris-sparc-200705-pkg.tar real 2:59.77 user 2:42.46 sys 5.74
UltraSPARC T2+ の 8 スレッドが Opteron 1.8GHz の1コアより 1.7 倍 も高性能となりました。ZFS のパラレル圧縮はまさに CMT の能力を最大に 引き出す処理の一つと言えるのではないでしょうか。
Posted at 09:30午後 8 26, 2008 by masahiko in Sun | 投稿されたコメント[1]
圧縮後のサイズの違いが気になりました。 違いはないものなのでしょうか?
Posted by arai on 8月月 27日, 2008年 at 11:06 午後 JST #