この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。
以前のエントリで少し触れましたが、会社の新しいサーバに
ZFSを導入しました。
実は、導入したのは良いのですが、先日新しいサーバの方にログインして、比較的容量が大きなファイルを書き込んだりしていると突然不自然に負荷がかかり、OSのロードアベレージがみるみるうちに上昇しました。
この状況から、CPUに対する負荷ではなくI/O処理に負荷がかかっている、即ち、新しく導入したZFSに問題があるのではないか、ということに気がつきました。
そしてその状況を解決すべくチューニングを行ったのですが、決定的には早くはなりませんでした。
そこでマシンを1台用意して、現在動かしているサーバと同じOSでチューニングテスト用の環境を作成した時のことです。
ここで新たにZFSのストレージプールを作成するのですが、ストレージプール作成コマンドを実行するときにあることに気がつきました。
「現在動かしているシステムでストレージプールを作成した時、ストレージプールに割り当てるデバイスの指定は何にしたのか」ということです。
ホストOSは FreeBSD で、データ領域とバックアップ領域の二つの領域を作成しているのですが、本稼動システムでのストレージプールのデバイス指定は以下のようにしていました。
/dev/ad1s1e: データ用ストレージプール
/dev/ad1s1d: バックアップ用ストレージプール
パーティション (スライス) 分けをOS側で行うやり方です。
そしてチューニングテスト用のマシンでストレージプールを作成する時に以下のようなデバイス指定にしてみました。
/dev/ad1: データ用およびバックアップ用ストレージプール
ディスク全体をひとつのストレージプールとして作成し、パーティション分けはZFSに任せるやり方です。
この構成でddを実行してみるとなんと書き込み速度が2倍以上に向上していました。
結論ですが、
ZFS はディスク全体をストレージプールとして作成した方が良い
ということです。
個人のブログなどで FreeBSD でZFSを使う事例をいくつか見てきましたが、上記の事柄に触れているところはありませんでした。
逆に、最初に挙げたような構成で作成しているところが目立ちました。
後に Sun Microsystems の公式ドキュメントを参照してみると「ディスク全体をストレージプールに割り当てない場合はZFSの性能は保証出来ない」との記述がありました。
ただし、公式のドキュメントは Solaris 向けのドキュメントなので、参考例などを FreeBSD に適用するにはデバイス指定の部分などは適宜読み替えないといけません。
現在会社で動かしているサーバは本来の性能が出ないような構成で構築してしまったので、ディスク全体をストレージプールとして使用するような構成に切り替える必要があります。
幸い、システムを再構築するような変更を加えなくとも正しい構成に移行出来そうだということが分かったので、近いうちに最適な構成に変更出来るかと思います。
担当: 金子 (問題が解決してくれるといいなあ)