ZFS でデータ圧縮 : やっぱり Sun がスキ! やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20080826 2008年 8月 26日 火曜日

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 by arai on 8月月 27日, 2008年 at 11:06 午後 JST #

コメント
  • HTML文法 不許可