Database Support Blog

  • Oracle Database
2016.06.17

自動メモリ管理(AMM)設定時に獲得する共有メモリのサイズ

自動メモリ管理(AMM)

Oracle Databaseのメモリ領域は、大きく分けるとSGAとPGAがあります。11gR1以降のリリースでは、自動メモリ管理(Automatic Memory Management:AMM)を利用することで、SGAとPGAを名前のとおり自動で管理してくれます。

例えば、共有プールとして使用したいメモリが不足すると、バッファキャッシュから共有プールにメモリを動的に割り当て、ORA-04031の発生を防いでくれるなど非常に有効な機能なのですが、設定によって獲得される共有メモリのサイズについて正しい認識をしておかないと、思わぬトラブルを引き起こします。

自動メモリ管理(AMM)の設定とパラメータの依存関係

自動メモリ管理(AMM)を利用するには、初期化パラメータMEMORY_TARGET/MEMORY_MAX_TARGETを設定します。

MEMORY_TARGETはSGAとPGAの合計で使用するメモリサイズのターゲットを指定し、MEMORY_MAX_TARGETを指定することで使用可能な最大メモリサイズを設定することが可能です。

関連するパラメータの関係を簡単にまとめると以下のとおりです。

・MEMORY_MAX_TARGETはMEMORY_TARGET以上の値を設定する(指定しなくても良い)
・MEMORY_TARGETを設定、MEMORY_MAX_TARGETが未設定の場合、
 MEMORY_TARGET = MEMORY_MAX_TARGETに設定される
・MEMORY_MAX_TARGET > MEMORY_TARGET の場合、
 MEMORY_MAX_TARGETの値までMEMORY_TARGETをインスタンス稼働中に増やすことが可能
・SGA_MAX_SIZEが未設定の場合、MEMORY_MAX_TARGETの値が設定される

最後の、SGA_MAX_SIZEのデフォルト値がMEMORY_MAX_TARGETの値であることに注意が必要です。

インスタンス起動時にSGA_MAX_SIZEの値で共有メモリを獲得する

SGAとPGAのサイジングについては実測値ベースで検討することが多いため、MEMORY_TARGETに設定する値を段階的に増やして様子を見たいという要望は少なくありません。

MEMORY_MAX_TARGETは静的なパラメータです。設定値の変更を有効にするには再起動が必要なため、MEMORY_MAX_TARGETに非常に大きな値を設定し、不足していた場合に増加することを考慮してMEMORY_TARGETを小さめの値に設定されているケースがあります。

Oracle Databaseはインスタンス起動時、SGA_MAX_SIZEの値で共有メモリを獲得します。

つまり、"MEMORY_MAX_TARGET > MEMORY_TARGET"で値を指定していた場合には、デフォルトではSGA_MAX_SIZE = MEMORY_MAX_TARGETとなるため、MEMORY_MAX_TARGETに指定した値の分だけ共有メモリが獲得されます。

MEMORY_MAX_TARGET(SGA_MAX_SIZE) = MEMORY_TARGET時のipcsコマンドの結果
▲MEMORY_MAX_TARGET(SGA_MAX_SIZE) = MEMORY_TARGET時のipcsコマンドの結果


MEMORY_MAX_TARGET(SGA_MAX_SIZE) > MEMORY_TARGET時のipcsコマンドの結果
▲MEMORY_MAX_TARGET(SGA_MAX_SIZE) > MEMORY_TARGET時のipcsコマンドの結果


MEMORY_MAX_TARGETに必要以上に大きな値を設定してしまうことで意図せず共有メモリが獲得されてしまい、パフォーマンスダウンやメモリ枯渇に起因したエラーが発生したというお問い合わせは少なくありません。

特に、同一サーバ内に複数のデータベースを作成している環境では、いずれかのデータベースでこのような設定を行うことによって、他のデータベースで影響が顕在化することもあります。

なお、MEMORY_MAX_TARGET > SGA_MAX_SIZE で初期化パラメータを明示的に設定することで獲得する共有メモリを指定することはできますが、この場合、自動メモリ管理で調整されるSGAの幅がSGA_MAX_SIZEで指定した範囲内に限定されてしまいますので、自動メモリ管理の恩恵を十分に受けることができません。

まとめ:初期化パラメータの変更は慎重に

SGA_MAX_SIZEのデフォルト値はリファレンスマニュアルの SGA_MAX_SIZE には記載されていますが、 MEMORY_TARGET MEMORY_MAX_TARGET には記載されていないため、知らずに変更をされてしまうケースがあります。

MEMORY_TARGET/MEMORY_MAX_TARGETはSGA_MAX_SIZE以外にも、Linux環境でHugePagesを使用する場合は無効化しておく、/dev/shm(共有メモリのサイズ)よりも小さい値を指定する(ORA-00845)必要があるなどの注意点もあります。この点については 管理者リファレンス インストレーション・ガイド に記載されています。

初期化パラメータの変更を行う際には、その初期化パラメータだけでなく他に影響する範囲がないか、ということも慎重に確認するようにしましょう。

筆者情報

大野 高志

サービス事業部 サポートセンター

2007年にアシスト入社後、Oracle Databaseのサポート業務に従事。現在はサポートの傍ら、未解決のトラブルを一つでも多く減らせるよう、サポートセンターに蓄積されているノウハウを社内外に伝える活動を行っている。


■本記事の内容について
 本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。

■商標に関して
 ・Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
 ・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
  文中の社名、商品名等は各社の商標または登録商標である場合があります。

関連している記事

  • Oracle Database
  • Oracle Cloud
2025.09.09

【2025年10月開催!】アシストテクニカルフォーラム 2025 オラクル系セッションのご案内

2025年10月に開催される当社最大のテクニカル情報満載のイベント「アシストテクニカルフォーラム 2025」におけるオラクル系セッションをまとめてご紹介します。Oracle Database 23aiやOCIの最新情報が満載です。

  • Oracle Cloud
  • Oracle Database
2025.09.03

【OCI】BaseDBでファイルシステムを拡張-FSSで/u01を増やし、Data Pumpを活用する方法

BaseDBの機能で拡張できない領域を、FSSを使用して拡張する方法をご紹介します。また、/u01領域配下をFSSを使用して拡張する方法と、拡張した領域に対してOracle Data Pump(以降、Data Pump)のデータをエクスポート/インポートする方法も説明します。

  • Oracle Cloud
  • Oracle Database
2025.08.25

VMware HCXのMONで実現!クラウド移行後の通信経路最適化とパフォーマンス向上

仮想マシンのクラウド移行における課題のひとつ「移行後の通信経路の最適化」を実現するHCXの機能、Mobility Optimization Networking(以下、MON)に焦点を当て、その機能の概要から具体的な設定手順まで、豊富な画像とともに詳しく解説します。

ページの先頭へ戻る