x86 Linux 環境で大容量メモリを活用する
PC用のメモリは年々大容量になりかつ安くなっています。
Windows NTベースの C/Sシステムを構築していた頃などはサーバーで数十MB~数百MB、PCに至っては数MB~数十MBでしたが、最近では GB単位です。
これだけ大容量のメモリを安価に搭載できるのであれば、小規模なデータベースであれば、データを丸ごとキャッシュに載せて運用することも可能です。
そのほうが、パフォーマンスチューニングにコストを掛けるよりも効率的かもしれません。
しかし、メモリをドカドカと積んだところで、いまだなお健在の x86系の CPUではアーキテクチャの制約により広大なメモリ空間をフル活用することができません。
x86ではプロセス当たりの最大メモリ空間は 4GBです。そのうち約1GBはカーネルが占有しますので、ユーザーが使用できるのは約3GBとなります。
さらに、Oracleのデフォルトの設定では、3GBのうち、SGAに割り当てられる最大メモリ空間は 約1.7GBとなっています。
この制約を超えてメモリを利用するには特別な設定が必要になります。
例えば、x86 Linuxでは 以下の2つの方法があります。
SGAアドレス空間の拡張
参考:Oracle Database 管理者リファレンス 10g リリース2(10.2)for UNIX SystemsC-5 Linux システムでのOracle Database の管理 - SGA アドレス空間の増加
ユーザーが利用できる 3GBの中で SGAに割り当てられるアドレス空間を拡張する方法です。
ただし、この方法では SGAを最大約2.6GBまでにしか拡張することができません。
効果はしれているように思います。
拡張バッファ・キャッシュ機能の利用
参考:Oracle Database 管理者リファレンス 10g リリース2(10.2)for UNIX SystemsC-2 Linux システムでのOracle Database の管理 - 拡張バッファ・キャッシュのサポート
VLM(Very Large Memory)をサポートする OSでなければ利用できませんが、この方法を利用すればデータベース・バッファ・キャッシュに 4GB超のメモリを活用することができます。
ただ、拡張バッファ・キャッシュ機能を利用した場合、使用できるメモリ空間は青天井のようにも思えますが、実際には広大なメモリ空間全体にシームレスにアクセスできるわけではありません。
拡張バッファ・キャッシュへのアクセスは SGA内に割り当てられている VLMウィンドウという領域を拡張バッファ・キャッシュの特定のアドレス空間にマッピングすることによって行われます。
この VLMウィンドウにはデフォルトで 512MBが割り当てられていますので、拡張バッファ・キャッシュをどれだけ大きく確保しても、VLMウィンドウを再マップせずにアクセスできるのは 512MB分だけということになります。
故に、全表走査のように連続したブロックをシーケンシャルに読み込むような場合は拡張バッファ・キャッシュの効果が期待できますが、索引走査のように非連続ブロックをランダムアクセスするような場合は VLMウィンドウの再マップが頻繁に実行されることでオーバーヘッドが発生し、パフォーマンスが大幅に悪化するとこともあるようです。
Oracle Database 10g Release 2 検証レポート [第2回] Oracle Database 10g R2 64bitと32bit VLMの基本性能検証
りなっくす奮闘記 事件File No.20 x86-64のデータベース・サーバーの実力は!?
ということで、x86では一応大容量のメモリを利用する方法は用意されているものの、実際には大いに難ありのようです。
大容量のメモリを利用するのであれば、4GBの制限がなく、広大なメモリ空間を普通に扱うことのできる x86-64環境を構築したほうがよさそうです。
【関連記事】
[Oracle] x86 Linux 環境での拡張バッファ・キャッシュの利用(その1)
[Oracle] x86 Linux 環境での拡張バッファ・キャッシュの利用(その2)
[Oracle] x86 Linux 環境での拡張バッファ・キャッシュの利用(その3)