«前の日記(2014-05-20) 最新 次の日記(2014-06-12)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。HTTPS化したいとは思っているんです…

OSS活動をご支援いただける方を募集しています


2014-05-21 ZFS ZLE 圧縮を有効にしてみる

ZFS の ZLE 圧縮と LZ4 圧縮を有効にしてみる

実は FreeBSD 8.3, 9.1-RELEASE から ZFS において ZLE 圧縮が使えるようになっていました。

ZLE は連続するゼロをランレングス法で圧縮する方法のことで、圧縮のコストも低いのですべてのファイルシステムで有効にしてみました。VM のディスクイメージを多く格納している場合に効くかもしれません。

変更前のファイルシステムの圧縮状況がこんな感じ。

% zfs get compress
NAME                             PROPERTY     VALUE     SOURCE
zroot                            compression  off       default
zroot/tmp                        compression  on        local
zroot/usr                        compression  off       local
zroot/usr/home                   compression  off       local
zroot/usr/home@2014-05-21_13:32  compression  -         -
zroot/usr/jail                   compression  off       local
zroot/usr/local                  compression  off       local
(snip)
zroot/var/run                    compression  off       default
zroot/var/tmp                    compression  lzjb      local

ちまちま1つずつ変更するのは面倒なので、下記のコマンドで一気にやってしまいます。ただし、ブートに使うファイルシステムには圧縮は設定できないので下記のようなメッセージが出ます。

% zfs get compression | awk '{ if ($3 == "off") print $1 }' | xargs -n1 sudo zfs set compression=zle
cannot set property for 'zroot': property setting is not allowed on bootable datasets
(snip)

圧縮方式を後から変更した場合は、後から書き込んだデータにだけ新しい圧縮方式が適用されるので、効果が現れるのはもう少し後からになります。

ついでに、lzjb や gzip で圧縮するように設定しているファイスシステムも、10.0-RELEASE から追加された LZ4 に変更します。展開速度は gzip に少し劣るケースがあるものの、lzjb と比較して圧縮で50%、展開で80%以上高速らしいです。

ZLE の時と同じようにコマンドで一気にやろうとしたら、10.0-RELEASE から追加されたアルゴリズムなので当然 zpool のアップグレードが必要でした。

% zfs get compression | awk '{ if ($3 == "lzjb") print $1 }' | xargs -n1 sudo zfs set compression=lz4
cannot set property for 'zroot/usr/src': pool and or dataset must be upgraded to set this property or value

一応使える機能を確認してみると feature@lz4_compress のところが disabled になっているので、LZ4 圧縮が使えない状態になっていることがわかります。

% zpool get all|grep feature
zroot  feature@async_destroy          disabled                       local
zroot  feature@empty_bpobj            disabled                       local
zroot  feature@lz4_compress           disabled                       local
zroot  feature@multi_vdev_crash_dump  disabled                       local
zroot  feature@spacemap_histogram     disabled                       local
zroot  feature@enabled_txg            disabled                       local
zroot  feature@hole_birth             disabled                       local
zroot  feature@extensible_dataset     disabled                       local
zroot  feature@bookmarks              disabled                       local
zroot  feature@filesystem_limits      disabled                       local

zpool をアップグレードします。後戻りはできないので注意。出力に書かれているように、ブートに使っているプールの場合は新しいブートコードをインストールするのを忘れないようにしてください。

# zpool upgrade zroot
This system supports ZFS pool feature flags.

Successfully upgraded 'zroot' from version 28 to feature flags.
Enabled the following features on 'zroot':
  async_destroy
  empty_bpobj
  lz4_compress
  multi_vdev_crash_dump
  spacemap_histogram
  enabled_txg
  hole_birth
  extensible_dataset
  bookmarks
  filesystem_limits

If you boot from pool 'zroot', don't forget to update boot code.
Assuming you use GPT partitioning and da0 is your boot disk
the following command will do it:

	gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
bootcode written to ada0

プールのアップグレードができたかどうか一応確認します。

 % zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Every feature flags pool has all supported features enabled.

さっきまで disabled だった feature が enabled もしくは active になっています。

% zpool get all|grep feature
zroot  feature@async_destroy          enabled                        local
zroot  feature@empty_bpobj            enabled                        local
zroot  feature@lz4_compress           enabled                        local
zroot  feature@multi_vdev_crash_dump  enabled                        local
zroot  feature@spacemap_histogram     active                         local
zroot  feature@enabled_txg            active                         local
zroot  feature@hole_birth             active                         local
zroot  feature@extensible_dataset     enabled                        local
zroot  feature@bookmarks              enabled                        local
zroot  feature@filesystem_limits      enabled                        local

では気を取り直してもういちど、lzjb で圧縮されているファイルシステムの圧縮アルゴリズムを LZ4 に変更します。gzip で圧縮されているファイルシステムがあれば同様に。

% zfs get compression | awk '{ if ($3 == "lzjb") print $1 }' | xargs -n1 sudo zfs set compression=lz4

無事に LZ4 に変更されています。繰り返しになりますが、実際に新しい圧縮方式が適用されるのは、これから書き込まれるデータに対してです。

% zfs get compress|grep lz4
zroot/usr/src                    compression  lz4       local
zroot/var/crash                  compression  lz4       local
zroot/var/db/pkg                 compression  lz4       local
zroot/var/log                    compression  lz4       local
zroot/var/mail                   compression  lz4       local
zroot/var/tmp                    compression  lz4       local

ZFS, zpool のバージョン、フィーチャーフラグ、アップグレード方法については以下が参考になります。古い記事も含まれているのでその点は注意してください。