現在地

Oracle Database のメモリー構成

*以下は、サポート契約締結中のお客さまに毎月配信しているサポートレターより一部抜粋して掲載しています。

Oracle Database のメモリー構成としては、大きく SGA(システム・グローバル・エリア)と PGA(プログラム・グローバル・エリア)が挙げられます。安定したパフォーマンスを実現するには、これらのメモリー領域に対して適切なチューニングを行う必要がありましたが、Oracle Database では、新しいバージョンがリリースするたびに、以下のような、メモリー調整の機能が実装されてきました。

各バージョンごとのメモリー管理機能

9.0.1 〜
PGA の自動管理 PGA_AGGREGATE_TARGET
10.1 〜
SGA の自動管理 SGA_TARGET
11.1 〜
SGA と PGA の自動管理 MEMORY_TARGET
12.1 〜
PGA のサイズ制限 PGA_AGGREGATE_LIMIT

今回は、上述の Oracle Database の各メモリー管理機能についてご紹介します。

SGA と PGA について

各メモリー管理のパラメーターをご紹介する前に、まずは、SGA と PGA について、簡単にご案内します。SGA(システム・グローバル・エリア)は、Oracle Database の全プロセスによって共有されるメモリー領域となります。具体的には、頻繁にアクセスされるデータをメモリー上にキャッシュさせる "バッファー・キャッシュ" や、解析済み SQL の情報を含む "共有プール" といったコンポーネントから構成されます。一方、PGA(プログラム・グローバル・エリア)は、ユーザーセッション毎に紐付いた非共有のメモリー領域となります。
そのため、各プロセスごとに "スタック領域" やソートやハッシュの作業領域となる "セッション情報(UGA)" が、PGA 上に構成されます。ただし、共通サーバ接続や、12.1 からのマルチスレッド・モデルを採用している場合、UGA は PGA 上ではなく、SGA 上に確保されます。

参考ドキュメント

  • PGA と UGA のサイズを確認する方法(KROWN:17248)
    (ドキュメントID 1704501.1)

PGA の自動調整機能

"PGA の自動調整機能"は、リリース 9.0.1 より実装された機能となり、ソート処理やハッシュ結合などに使用される SQL 作業領域をOracle が自動調整する機能となります。
具体的には、PGA_AGGREGATE_TARGET パラメーターに、対象インスタンスの総 PGA メモリーサイズの目標値を設定します。絶対的な上限値ではなく、あくまで目標値となり、ソートやハッシュ以外のプロセスで使用する PGA メモリーは自動調整の対象外となりますので、PGA のメモリー・サイズが、PGA_AGGREGATE_TARGET に指定したサイズを上回るケースが起こり得ます。詳細については以下のドキュメントもご参照ください。

参考ドキュメント

  • Oracle9i 新機能 PGA(プログラム・グローバル領域)の自動調整機能およびチューニング(KROWN:34328)
    (ドキュメントID 1711413.1)

自動共有メモリー管理

リリース 10.1 からは、SGA の各コンポーネントへのメモリー割り当てを負荷状況に応じて、Oracle が自動調整する"自動共有メモリー管理"の機能が導入されました。具体的には、SGA_TARGET パラメーターに SGA の合計サイズを指定することで、以下のコンポーネントのメモリー・サイズが自動調整されます。

自動調整されるコンポーネント

  • 共有プール
  • ラージ・プール
  • Java プール
  • ストリーム・プール(10.2 以降の実装)
  • DEFAULT バッファー・プール

SGA_MAX_SIZE パラメーターを指定している場合は、その値が SGA サイズの上限値となり、その上限値の範囲内で、SGA の各コンポーネントのメモリー・サイズが調整されます。
尚、DB 起動時に SGA_MAX_SIZE パラメーターの値が、SGA_TARGET の値より小さい場合は、SGA_MAX_SIZE パラメーターの値は、SGA_TARGET の値で上書きされます。また、その他のコンポーネントのパラメーター(DB_CACHE_SEIZE、SHARED_POOL_SIZE 等)を個別に設定している場合、それらのパラメーターに指定したサイズを下回らないよう、メモリー・サイズが調整されます。

参考ドキュメント

  • [10g 新機能] 自動共有メモリー管理(初期化パラメーターsga_target)(KROWN:84769)
    (ドキュメントID 1727007.1)1711413.1)

SGA のコンポーネント・サイズの調整

SGA 内の各コンポーネントのメモリー・サイズの割り当ては、バッファ・キャッシュとその他のコンポーネント間で調整され、基本的には、バッファ・キャッシュがメモリー領域の供給元となります。例えば、共有プールと Java プール間でメモリーの調整がされることは無く、通常は、バッファ・キャッシュからメモリーを割り当てるといった動作が行われます。

共有プール、ラージ・プール、Java プール 等の領域が足りない場合には、ORA-4031 やORA-29554(Java プールの領域不足)が発生しますが、バッファ・キャッシュの領域が不足する場合、待機は発生しますが、他の SGA のコンポーネントのようにエラーは発生しません。また、これらの SGA 内の自動調整には、次の 2 種類のモードが存在します。

  • DEFREEED モード
  • IMMEDIATE モード

DEFREEED モードは、Oracle が内部的に、SGA 内のメモリー使用のワークロードを監視し、システムの負荷状況に応じて、各コンポーネントに対するメモリー調整を行うモードとなります。一方、IMMEDIATE モードは、拡張を行わないと ORA-4031 が発生する状況下で行われる自動調整のモードとなります。これらの自動調整の履歴は、V$SGA_RESIZE_OPS ビューより参照が可能となっており、OPER_MODE 列の値('DEFREEED' か 'IMMEDIATE')で、どちらのモードで調整されたか判断ができます。

参考ドキュメント

  • 自動共有メモリー管理(ASMM) における各コンポーネントのサイズ調整について(KROWN:138950)
    (ドキュメントID 1747846.1)

自動メモリー管理

リリース 11.1 以降では、SGA と PGA の両方のメモリー使用量を制御する"自動メモリー管理"機能が実装されました。MEMORY_TARGET パラメーターにインスタンスが使用するメモリーの合計サイズを指定することにより、DB の負荷状況を鑑みて SGA と PGA 間のメモリー調整が自動で行われます。

SGA と PGA 間のメモリー・サイズの調整(割り当て配分)については、MEMORY_MAX_SIZE パラメーターや、上述の SGA_TARGET や PGA_AGGREGATE_TARGET の設定値に依存します。
こちらも、詳細については以下のドキュメントもご参照ください。

参考ドキュメント

  • [11g新機能] 自動メモリー管理(AMM) について(KROWN:125805)
    (ドキュメントID 1740187.1)
  • 自動メモリー管理(AMM) における各コンポーネントのサイズ調整について(KROWN:151027)
    (ドキュメントID 1754118.1)

なお、PGA を含む各コンポーネントで割り当てられたメモリー・サイズの履歴(インスタンス起動時の最大/最小値、調整操作の回数 等)は、V$MEMORY_DYNAMIC_COMPONENTS ビューで確認が可能です。

PGA サイズの制限

PGA_AGGREGATE_TARGET パラメーターの値は、あくまでソフト・リミットであり、状況によっては、PGA メモリー使用量が PGA_AGGREGATE_TARGET の設定値を超過するケースが発生しましたが、リリース 12.1 では、PGA_AGGREGATE_LIMIT パラメーターが導入され、PGA メモリー使用量の制限値を指定することが可能となっています。PGA_AGGREGATE_LIMIT パラメーターの設定値を超過して、PGA メモリーが消費されている場合、対象のセッションおよびプロセスは、強制終了され、ORA-4036 が発生します。PGA_AGGREGATE_LIMIT パラメーターのデフォルト値については、12.1 と 12.2 で挙動が異なりますので、以下のドキュメントもご参照ください。

参考ドキュメント

  • データベース・パラメーター PGA_AGGREGATE_LIMIT を使用してプロセス・サイズを制限する
    (ドキュメントID 1573991.1) (ドキュメントID 1740187.1)

また、PGA_AGGREGATE_LIMIT パラメーターについては、過去の Intellilink Oracle Topic でも紹介しておりますので、こちらも是非ご一読ください。

まとめ

11g や 12c をお使いのお客さまであれば、SGA の各コンポーネント や PGA 間メモリー割当について、意識する機会は少なくなっているかと思います。しかしながら、当社サポートセンターにおいても、ORA-4031 の発生といったお問い合わせは定期的に頂戴しており、また、そのようなケースでは、Oracle Database の自動メモリー管理機能の仕様について、より深いご質問を頂くことがございます。今回は概要レベルのご紹介ですが、適宜ドキュメントなどもご案内しておりますので、既存環境のメモリー・マネージメントにご活用いただければ幸いです。

(オラクル事業部 サポート・サービス担当 露木)