はじめに
Oracle Database インスタンスのメモリ・アーキテクチャと言えばSGA、PGAですが、最近のOracle DBには新しく Managed Global Area (MGA) と呼ばれるメモリ領域が確保されるようになっています。
マニュアルなど公開資料に分かり易く情報がまとまっていないので、こちらに少しMGAの特徴やサイジングへの影響、参考資料を整理してみました。
参考資料
情報整理にあたって以下を参考にしました。
- MGA (Managed Global Area) Reference Note (Doc ID 2638904.1)
- MGA(Managed Global Area)リファレンスノート (Doc ID 2685485.1)
- Limiting Process Size with Database Parameter PGA_AGGREGATE_LIMIT (Doc ID 1520324.1)
MGAの特徴概要
MGAとは
- 12.2.0.1 から新規導入
- SGA、PGAとは異なる性質を持つ
- 複数のプロセスが共有して使うメモリ領域
- 動的に確保される
- パラレル・クエリの一時的な作業領域などで使われる
- PGAとは異なる領域だが、MGA領域はPGA関連の初期化パラメータで確保する(具体的なサイジングは後述)
MGAの使用状況確認
- MGAの使用状況は v$pgastat から確認可能(ただし19c以降のみ)
SQL> select * from v$pgastat;
NAME VALUE UNIT CON_ID
---------------------------------------------------------------- ---------------- ------------ ----------------
...
MGA allocated (under PGA) <value> bytes 0
maximum MGA allocated <value> bytes 0
...
MGA関連の待機イベント
- 新しく用意されたMGA関連の待機イベント
- latch: MGA shared context root latch
- latch: MGA shared context latch
- latch: MGA heap latch
LinuxにおけるMGAの構成
- MGAは PGA_AGGREGATE_LIMIT の下でカウントされ、/dev/shmページを使用
- /dev/shmページは、通常のPGAメモリとは異なり、スワップ不可
- PGA_AGGREGATE_LIMITが設定されていない場合、非公開Bug 30851951 が発生する可能性あり
- 18cおよび19cでは、IPCはMGAを使用
- MGA用にラージページを構成可能
MGA関連のエラー
- ORA-461からORA-468、ORA-27778およびORA-27779 が該当
既知のMGA関連のバグ
- BUG 30851951 - OPEN FDS TO /DEV/SHM/KSIPC_MGA.DAT CAUSES FILE-MAX LIMIT TO EXCEED AND CRASHES INSTANCE
- BUG 27903447 : FG SUFFERS FROM "MEMORY: REG/DEREG" WAIT FOR ABOUT 2 SECONDS IN TOTAL
- BUG 29202104 - LNX64-19.2-CDB, CLOSE ABORT PDBS, SMON HIT ORA-600 [504], [MGA SHARED CONTEXT LATCH]
- BUG 29123482 - Create sessions in cdb, ipc0 hit ORA-600 [mga seg reg failed] and ORA-04030, instance crashed (Doc ID 29123482.8)
- BUG 23563687 - IPC0 IS USING 2G RSS MEM WHICH IS THE TOP PROCESS TO USE RSS MEM
- BUG 27965499 - INSTANCE TERMINATED WITH ORA-600[MGA SEG REG FAILED]
- BUG 30293345 - LATCH: MGA SHARED CONTEXT LATCH WAITS AFTER MIGRATION TO 18C
MGAのサイジング
- 18c以降はMGA用の領域がPGA外に取得されるようになった
- ただしMGAの領域はPGAの初期化パラメータによって確保される
- そのため18c以降は元々のPGAの見積に対して、さらにMGA分の領域を加算する必要がある
- サイジングの計算式は以下の通り
PGA_AGGREGATE_LIMIT = (original PGA_AGGREGATE_LIMIT value) + ((maximum number of connected processes) * 4M)
- PGA_AGGREGATE_LIMIT についての補足
- 12cR1から導入された初期化パラメータ
- PGA_AGGREGATE_TARGETと異なり、厳格にPGAの消費メモリを定める
- デフォルトでは、PGA_AGGREGATE_LIMITは2GB、PGA_AGGREGATE_TARGETの200%、および3MB×PROCESSESパラメータのうち、より大きい値に設定
- 18c以降ではRAC環境の場合 5MB×PROCESSESパラメータを推奨
まとめ
12cR2まではPGA内にMGA用の領域が確保されていましたが、18c以降はPGAの外に確保されます。
したがって18c以降でPGAのサイジングをする際は、MGAの領域も意識して PGA_AGGREGATE_LIMIT を設定しましょう。