筆者について
FreeBSDを通じてOSSにささかな貢献を。
- 日本xrdpユーザ会発起人
- xrdp developer
- FreeBSD developer
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%以上高速らしいです。
- 間もなく登場! FreeBSD 10.0、IT技術者なら知っておくべき11の新機能 (1) 高速圧縮アルゴリズム、圧縮キャッシュ
- アーカイバlz4を試してみたら(圧縮は)速すぎ笑った | Nobwak's Lair
- [base] Revision 246586
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 のバージョン、フィーチャーフラグ、アップグレード方法については以下が参考になります。古い記事も含まれているのでその点は注意してください。