現在地

Oracle Database 12c の新パラメータ「PGA_AGGREGATE_LIMIT」

今号では、Oracle Database 12c からの新しいパラメータである「PGA_AGGREGATE_LIMIT」をご紹介します。是非ご一読ください。

PGA(プログラム・グローバル領域)とは?

はじめに、PGA についてご説明します。PGA はサーバプロセスのグローバル変数・データ構造・制御情報を含む非共有のメモリ領域です。各サーバプロセス毎に固有の PGA 領域持っており、サーバプロセス間で排他的にアクセスが行われます。 PGA 内で解放されたメモリは PGA 内で再利用されます。セッションの終了時には、使用していたメモリが解放されます。専用サーバ接続の場合は、PGA 内に SQL 作業領域(ソート処理やハッシュ結合時に使用)が設けられます。共有サーバ接続の場合は、SGA 内に SQL 作業領域が設けられます。大量のプロセスがソート処理を行ったり、インスタンスのプロセス数が増大した場合は、PGA が肥大化します。結果として OS のメモリが枯渇してシステムが不安定な状況になる可能性があります。Oracle Database では、プロセスが使用可能なメモリの制限に達した場合に、ORA-04030 が発生します。

※ORA-04030 は、Oracle 側に存在するサーバプロセスが新たにメモリの割り当て要求を行った結果、プロセスが使用可能なメモリの上限に達した、もしくは OS のメモリ不足である旨を示すエラーです。

PGA_AGGREGATE_TARGET について

次に 9i からの機能である PGA_AGGREGATE_TARGET についてご説明します。
PGA_AGGREGATE_TARGET は、インスタンスにおける総 PGA メモリサイズから SQL 作業領域を自動調整するパラメータです。設定した値を目標値として調整を行います。
PGA_AGGREGATE_TARGET の設定では、各プロセスで使用される PGA は制御されません。そのため、メモリが枯渇するまで PGA サイズは増え続けます。

PGA_AGGREGATE_LIMIT について

12c の新機能である PGA_AGGREGATE_LIMIT についてご説明します。PGA_AGGREGATE_LIMITは PGA_AGGREGATE_TARGET と異なり、インスタンス全体で獲得可能な PGA の上限値を設定するデフォルトで有効なパラメータです。上限値を超えたメモリを獲得しようとした場合の動作は以下のとおりです。

【SYS ユーザおよびバックグラウンド(JOBキュー除く)プロセス以外の場合】
  • ORA-04036 が発生します。
    ※ORA-04036 は、インスタンスの PGA の合計値が超えたことを示すエラーです。
  • Oracle 内部にて最もチューニングが困難なメモリを使用しているセッションを終了させて、PGA の一部を解放します。上限値以下になるまで繰り返します。
    ※チューニングが困難なメモリの選定基準は公開されておりません。
【SYS ユーザおよびバックグラウンド(JOBキュー除く)プロセスの場合】
  • ORA-04036 は発生しません。
  • これらのプロセスが最もチューニングが困難なメモリを使用している場合は、PGA 使用量を定期的にトレースファイルへ書き込みます。

下記のうち、1番大きな値がデフォルト値になります。

  • 2GB
  • PGA_AGGREGATE_TARGET × 2(200%)
  • PROCESSESパラメータの値 × 3MB
※1. PGA_AGGREGATE_LIMITは alter system 文にて動的に変更が可能です。
SQL> alter system set pga_aggregate_limit=3G;

システムが変更されました。

※2. 2GB 以下の場合は、下記のエラーが出力されます。
SQL> alter system set pga_aggregate_limit=1G;
alter system set pga_aggregate_limit=1G
*
行1でエラーが発生しました。:
ORA-02097: 指定した値が無効なので、パラメータを変更できません。
ORA-00093:
pga_aggregate_limitは、2048Mから100000Gの間に設定する必要があります。
※3. 無効にする場合には、下記を実行します。
SQL> alter system set pga_aggregate_limit=0;

システムが変更されました。

まとめ

本パラメータを予め許容できる値に設定しておくことで、メモリが枯渇してシステムが不安定な状況になる可能性を防ぐことができます。安定稼動させるための 1 つの方法としてご検討いただければ幸いです。また、従来どおりの動作にしたい場合には、無効化することをご検討ください。

(オラクル事業部 技術担当サポートセンターG 内田)