こんにちは。日々是発見が楽しみな西山です。
今回はファイルシステム「ZFS」について、そしてLinux上で利用する際のチューニングポイントを書いてみます。
そもそもZFSって?
ZFSはLinuxで利用できるファイルシステム(ext4、xfsなど)の一種です。
どこでも多用される、というものではないですが、非常に多機能、かつソフトウェアRAIDとして堅牢なファイルシステムで、オンプレミス環境のファイルサーバーやNAS製品で重宝されています。
しかもSSD・HDDハイブリッドストレージまでソフトウェアのみで組めてしまうからすごいです……弊宅でもハイブリッド構成を組んでいますが、超高速でHDDと感じないレベルの快適さです!
ただし、多機能が故に設定可能な項目(プロパティ)が大量にあり、組み合わせを間違えると性能に悪影響を及ぼすこともあります。
何回か前のエンジニアブログで「Sambaサーバーを構築してみた記録」という記事を書きましたが、その時にSambaストレージをZFSで構成しました。
その経験をもとに「LinuxでZFSストレージを構成する時、必ず変更すべき5つのプロパティ」をご紹介します。
必ず変更すべき5つのプロパティ
「zpool create」コマンドでZFSプールを作ったら「zfs get all」でプロバティ一覧を表示し、以下の5つのプロパティが違う値になっていたらすぐ変更しましょう。
- acltype=posix
ZFSはSolarisOSやFreeBSDで発展した歴史的経緯があり、acltypeの既定値が「nfsv4」になっているのですが、Linuxにマウントする場合は「posix」に変更することでパフォーマンスが向上します。
- aclmode=passthrough
- aclinherit=passthrough
このプロパティを設定すると、Samba経由で書き込まれたファイル・フォルダのACLはSambaで一元的に管理され、ZFSは介入しません。
ここが合ってないと「Windowsファイルサーバーに保存した時とセキュリティ設定がずれる」というようなトラブルが起きます。
- xattr=sa
- dnodesize=auto
「Sambaサーバーを構築してみた記録」記事中で、「WindowsファイルのACLとNTFS代替データストリームをLinux上のSamba共有に格納する」と書きました。その保存先となる、ZFS拡張属性に関する設定です。
「xattr=sa」で拡張属性の取り扱いをプラットフォーム(≒OS)に従わせ、「dnodesize=auto」で拡張属性のデータサイズを自動拡張するよう設定します。
Sambaサーバーの場合、Windowsエクスプローラーでフォルダを開くだけで拡張属性の読み取りが発生するので、この設定が合ってないと「フォルダを開くだけでグルグルする」ようなレスポンス低下が発生し、ユーザー体験が悪化してしまいます。
もうファイルを置いてしまった! そんな時は
ZFSストレージのプロパティ変更は、いつでも後から、ファイルを置いたままでも変更できます(一部クリティカルなプロパティを除く)。この柔軟性もZFSの優れている点です。
ただし、既に存在するファイルのプロパティは自動変更されません。それらを変更後の設定に揃えたい場合、ファイルを一度copyする必要があります(moveではダメです)。
大量のファイルを入れてしまってから設定間違いに気づくと絶望……なのですが、ピンチを救ってくれるpythonスクリプトが公開されています。
変更したいファイル群のトップディレクトリにこのスクリプトを設置し、引数無しで「./zfs-recompress.py」と実行すれば、ディレクトリを再帰的に潜ってすべてのファイルを順次コピーし、ファイルのタイムスタンプも元通りにしてくれます。
内部的にzfs send/recvでブロックレベルコピーをしているようで、rsyncなどのファイルレベルコピーよりも高速に処理できます。
私もこれで命を救われましたので、同じ罠にハマった人の助けになれば幸いです。