メモリの最適化とZFS
SSPCの出荷時に利用されるOS毎に、推奨のメモリ量は異なります。
- Solaris 10 1/13 + 最新CPU(Critical Patch Unit)
- 推奨8GB + アプリケーション利用量
- Solaris 11.4 + 最新CPU(Critical Patch Unit)
- 推奨16GB + アプリケーション利用量
またSSPCの場合、ファイルシステムにZFSを利用しているため、キャッシュを多く必要とします。
SSPCにZFSを利用している理由とその特徴
ZFSは、スナップショットやクローン、圧縮、暗号化、など様々な魅力的な機能があるだけでなく、データの安全性にも定評があるファイルシステムです。最大の特徴は、CoW(Copy on Write)の構造上、RMW(Read modify Write)方式と違い、データロストがほぼ無いと言っても良いメリットも上げられます。
そのかわり、「メモリやディスクが潤沢にある」ことを前提に設計されているため、CPUコアの余裕、メモリの余裕、ストレージの余裕が十分に必要になります。
具体的な数字は利用用途によって異なりますが、ZFS要に割り充てるキャッシュメモリは、ストレージ容量に関しては、概ね1/512程度の用意しておくことをお薦めしています(※1TBであれば2GB)。
また、ストレージは必要な容量の2〜3倍程度を用意することをお薦めしています。これは、ZFSがデータロストなどがないようにCopy On Writeを利用していることにも起因し、書き換え時は新しい場所に作られ、ストレージのIOが暇なときに不要になったエリアを回収する構造となっているため、安全性側に余裕をみている為に発生しています。
- レコードサイズ
- UFSは8kですが、ZFSでは128kがデフォルトです。データサイズをレコードサイズで割り、あまりのレコードサイズ未満のデータは全てパディング(レコードサイズの量)になります。
- スナップショット
- クラウド化の時、様々な状態で試行錯誤を行う場合があります。その際、現時点のスナップショットを取って以前の状態を保全したり、Solaris10では、ZFSによって拡張されたLive Upgradeの機能であるlucreateコマンドとluactivateを利用、Solaris11ではbeadmにより「起動環境」を複数持つことが可能です。
- クローン
- スナップショットを元に、データのクローンが可能です。
- CoWとデータの遅延削除
- ZFSが採用しているCopy On Write型のファイルシステムは、ファイルの更新がある時、レコードサイズ単位で新しい場所に書き換えたデータをコピーして格納し、元のデータ箇所を開放する手法です。従来のRead Modify Write方式では、同じ場所に書き換えデータを保存するため、その瞬間にシステム障害が起きると、そのデータが失われてしまいます(これがfsckなどが必要とする理由の1つです)。Read Modify Write方式は、ストレージの容量効率は良いものの安全性は低く、CoWは安全性が高いかわりに、開放タイミングまでの間は書き換えデータと元のデータは両方ディスクに保存されていることになります。解放処理はストレージが忙しくないタイミングに行うため、読み書き、書き込みの頻度が多いシステムでは空き容量がなかなか解放されないこととなります。
一般に、ファイルシステムはデータを格納する際に連続した領域に保存することで読み書きの速度を上げるように設計されています。しかし、ファイルの更新が行われる度に、フラグメンテーション(ストレージに対するデータ配置の連続性。例えばNTFSでのデフラグはフラグメンテーションを排除するツールです)などが起きにくいようにするため、なるべく連続したストレージの領域にファイルが配置されるように、空いた場所を探しながら配置をするアルゴリズムをもちます。しかし、ストレージの使用率が上がるほど、フラグメンテーションが起きない場所に配置する事が難しくなるため、ZFSではある段階で、このアルゴリズムを「最速一致」から「最良一致」に変更する構造を持ちます(このような連続配置の仕組みはZFSに限らず様々なファイルシステムが似た構造をもちます)。
アルゴリズムが最速一致から最良一致に変わる時、空いた場所の検索をする負荷が格段に上がり、書き込み速度が顕著に悪化しはじめます。
このタイミングはストレージの利用率によって判断され、Solaris10カーネルでは80%、Solaris11カーネルでは90%で発生するため、事実上これを死守ラインと考えていただき、監視ラインをSolaris10では7割、Solaris11では8割にすることをお薦めしています。
以上のように、ストレージサイズには余裕が必要になるため、2〜3倍を想定しながら、十分な容量の割当を行ってください。
- 参考≫ Solaris 10の場合(英語) https://docs.oracle.com/cd/E26505_01/html/E37384/zfspools-4.html#storage-8
- 参考≫ Solaris 11の場合(日本語) https://docs.oracle.com/cd/E75431_01/html/E75197/zfspools-4.html#SVZFSstorage-8
- 参考≫ Solaris 11の場合(英語) https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11.4/manage-zfs/storage-pool-practices-performance.html#GUID-3568A4BD-BE69-4F17-8A2E-A7ED5C7EFA79