Oracle DBのMGA(Managed Global Area)について
はじめに
Oracle DB 12cR1(12.2.0.1)から新しいメモリ領域としてMGA(Managed Global Area)が追加されていますが、最近MGAについて調査する機会があったので、簡単にまとめてみました。
※ MGAについては詳細な情報が公開されていないため、正確な情報が必要な場合にはSRを起票してオラクルサポートにお問い合わせください。
MGAの概要
- SGAやPGAとは異なる複数のプロセス間で共有されるメモリ領域
- 共有メモリ領域のため、ラッチ (latch: MGA) によってアクセスを制御して保護
- MGAセグメントは動的に作成、削除される
- MGAの主な使用例
- IPC(Exadataの共有PDで使用)
- MGAハッシュ結合(パラレルクエリー実行で使用)
- IMCDT(cursor duration tableで使用)
MGAのメモリ領域サイジング
19c以降では、MGAのサイズはPGAのサイズに含まれて計算されるため、旧バージョンからアップグレードする場合には、MGAのサイズを考慮してPGAの最大許容サイズ(PGA_AGGREGATE_LIMIT)を大きくしておく必要があります。
[1]
経験則でのサイジング経験則では、以下の計算式でサイジングできます。
現状の値ベースでのサイジング
より正確にサイジングしたい場合には、以下の計算式で現状の値をベースにサイジングできます。
「インスタンスのライフサイクルでのPGAの最大集計サイズ」はv$pgastatへの以下のクエリーで取得できます。
col max_pga for 99999999.9
select value/1024/1024 max_pga from v$pgastat where name='maximum PGA allocated' minus
select value/1024/1024 max_pga from v$pgastat where name='MGA allocated (under PGA)';
「インスタンスのライフサイクルでの最大接続プロセス数」はv$resource_limitへの以下のクエリーで取得できます。
select max_utilization from v$resource_limit where resource_name='processes';
【参考】PGA_AGGREGATE_LIMITについて
PGA_AGGREGATE_LIMITは、12cR1で導入されたパラメータでインスタンスごとに割り当て可能なPGAサイズの上限値(ハードリミット)を指定します。
- 値に0を指定した場合、インスタンスによって消費されるPGA集計サイズに制限なし
- デフォルト値よりも低い値を設定しないことを推奨
- デフォルト値はMEMORY_TARGETの設定状況によって変化
- MEMORY_TARGETが設定されている場合、MEMORY_MAX_TARGETの値に設定
- MEMORY_TARGETが設定されていない場合、PGA_AGGREGATE_TARGETの200%に設定
- MEMORY_TARGETもPGA_AGGREGATE_TARGETも設定されていない場合、物理メモリーサイズの90%から総SGAサイズを引いた値に設定
いずれの場合でも、デフォルトのPGA_AGGREGATE_LIMITは2GB、3MB × PROCESSES(RACの場合は、5MB × RACインスタンスのPROCESSES)以上の値が設定されます。
PGA_AGGREGATE_LIMITを超えた場合には、最もPGAを消費しているセッションまたはプロセスが中止や強制終了されてしまいますので、サイジングしたうえで適切な値の設定するようにしてください。
まとめ
- Oracle DBを旧バージョンから19c以降のバージョンにアップデートするときには、MGAのメモリ領域を考慮したPGA_AGGREGATE_LIMITのサイジングが必要です。
- 新規にOracle DBのインスタンスを作成するときには、マニュアルの推奨にしたがってPGA_AGGREGATE_LIMITを適切にサイジングしてください。
リファレンス
- MGA(Managed Global Area)リファレンスノート (Doc ID 2685485.1)
- Sizing the PGA in Oracle 19c - How to Account for the MGA Size (Doc ID 2808761.1)
- MGA Issue – and it is fixed with Oracle 19.8.0 and newer
- 1.271 PGA_AGGREGATE_LIMIT
-
最大接続プロセス数はPROCESSESの値に等しい。 ↩︎
Discussion