Amazon RDS for Oracle Database インスタンスで、空きメモリが少ない、またはスワップ使用率が高い問題にどのように対処したらいいですか?

最終更新日: 2021 年 9 月 30 日

Amazon Relational Database Service (Amazon RDS) for Oracle DB インスタンスで、空きメモリ不足またはスワップ使用率が高い問題に対処したいと考えています。

簡単な説明

Oracleデータベースでは、使用可能なメモリは、主にプログラムグローバル領域 (PGA) とシステムグローバル領域 (SGA) で使用されます。Oracle DB インスタンスを設定するときは、これら 2 つのコンポーネントの合計が物理メモリの合計よりも少なくなるようにして、他のホストプロセスおよび機能で空きメモリを使用できるようにします。メモリパラメータを調整して、高いスワップ使用率と大量の物理メモリの使用を回避する必要があります。スワップ使用率と推奨される制限の詳細については、「十分なメモリがあるのに Amazon RDS DB インスタンスがスワップメモリを使用するのはなぜですか?」を参照してください。

DB インスタンスが自動メモリ管理を使用している場合、Oracle データベースで使用されるメモリの合計量は、パラメータ MEMORY_TARGET および MEMORY_MAX_TARGET によって管理されます。MEMORY_TARGET に設定された値は、SGA と PGA の合計に等しくなります。SGA で使用されるメモリは、パラメータ SGA_MAX_SIZE および SGA_TARGET によって決定されます。 PGA で使用されるメモリは、パラメータ PGA_AGGREGATE_TARGET および PGA_AGGREGATE_LIMIT によって管理されます。これらのパラメータのデフォルト値は、パフォーマンス上の理由から高く設定されています。ただし、特定のユースケースでは、これらの高い値によってメモリの競合が発生し、スワップ使用率が高くなることがあります。

解決方法

この問題のトラブルシューティングを行うには、インスタンスのメモリ管理モードに基づいて、次のいずれかの方法を使用します。

  • DB インスタンスが自動メモリ管理を使用している場合は、MEMORY_TARGET の値を減らします。
  • DB インスタンスが自動共有メモリ管理を使用している場合は、インスタンスの PGA および SGA パラメータの値を減らします。

注: これらのパラメータは動的パラメータですが、これらのパラメータを変更するにはフェイルオーバーなしでインスタンスを再起動する必要があります。詳細については、「Oracle DB インスタンスで HugePages を有効にする」の注記を参照してください。

以下のステップでトラブルシューティングを試します。

1.    DB インスタンスが自動メモリ管理または自動共有メモリ管理を使用しているかどうかを確認します。そのためには、SGA、PGA、および MEMORY_TARGET のパラメータをチェックします。

SQL> SHOW PARAMETER SGA;

SQL> SHOW PARAMETER PGA;

SQL> SHOW PARAMETER MEMORY_TARGET;
  • MEMORY_TARGET が設定されている場合、インスタンスは自動メモリ管理を使用します。
  • MEMORY_TARGET が設定されていないが、SGA_TARGET と PGA_AGGREGATE_TARGET が設定されている場合、インスタンスは自動共有メモリ管理を使用します。

さまざまなメモリ管理モードの詳細は、Oracleのドキュメントの「メモリ管理について」を参照してください。

2.    次のクエリを実行して、PGA と SGA ごとのメモリ使用率をそれぞれ表示します。

SQL> SELECT (value/1024/1024) CURRENT_PGA_IN_USE_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA inuse';

SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB FROM V$SGASTAT;

次のクエリを実行して、最後の再起動後に PGA と SGA に割り当てられた最大メモリをそれぞれ表示します。

SQL> SELECT (value/1024/1024) MAX_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME = 'maximum PGA allocated';

SQL> SELECT SUM (bytes/1024/1024) MAX_SGA_SIZE_IN_MB FROM V$SGAINFO WHERE NAME='Maximum SGA Size';

次の問合せを実行して、PGA および SGA ごとのアドバイザリビューをそれぞれ表示します。

SQL> SELECT PGA_TARGET_FOR_ESTIMATE,
PGA_TARGET_FACTOR, ADVICE_STATUS, ESTD_TIME, ESTD_PGA_CACHE_HIT_PERCENTAGE FROM
V$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR;

SQL> SELECT SGA_SIZE,
SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROM
V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;

3.    メモリパラメータの適切な設定を定義して、過剰なメモリ消費と高いスワップ使用率を回避します。このような設定は、データベースをチューニングしてパフォーマンスを向上させるためにも役立ちます。インスタンスパラメータグループを使用して、これらの例のパラメータを変更できます。

インスタンスが自動メモリ管理を使用している場合は、MEMORY_TARGET パラメータのみが設定されます。このパラメータは、デフォルトでは次の値に設定されています。

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}

インスタンスが自動共有メモリ管理を使用している場合、パラメータ PGA_AGGREGATE_TARGET および SGA_TARGET はそれぞれ次のデフォルト値に設定されます。

PGA_AGGREGATE_TARGET= {DBInstanceClassMemory*1/8}

SGA_TARGET= SGA_MAX_SIZE = {DBInstanceClassMemory*3/4}

これらのデフォルト設定のメモリ使用率が高い場合は、デフォルト設定を調整して、Oracle インスタンスによって使用されるメモリを制限できます。前述のメモリアドバイザリビューを使用して、メモリパラメータを調整できます。ベストプラクティスは、本番データベースに変更を適用する前に、テスト環境でメモリパラメータを調整することです。

以下はその例です。

インスタンスが自動メモリ管理である場合は、次のように、MEMORY_TARGETMEMORY_MAX_TARGET の値のみを減らします。

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*1/2}

- または -

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/5}

- または -

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*2/3}

インスタンスが自動共有メモリ管理を使用している場合は、前のステップで示したアドバイザリ値に基づいて、SGA および/または PGA のメモリパラメータのみを減らします。以下はその例です。

SGA_TARGET = {DBInstanceClassMemory*1/2}

- または -

SGA_TARGET = {DBInstanceClassMemory*2/3}

PGA_AGGREGATE_TARGET に次の値を設定して、プログラムメモリ領域のメモリ使用率を調整することもできます。

PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12}

4.    特定のユースケースでは、PGA によるメモリ使用率が PGA_AGGREGATE_TARGET 値を超え、PGA_AGGREGATE_LIMIT パラメータで設定された値に達することがあります。PGA_AGGREGATE_LIMIT のデフォルト値は、データベースインスタンスのメモリ設定によって異なります。詳細については、Oracle のドキュメントの「PGA_AGGREGATE_LIMIT」を参照してください。PGA_AGGREGATE_LIMIT のデフォルト値が非常に高い場合、RDS インスタンスは基盤となるホストの物理メモリが非常に少ないか、またはゼロになっている可能性があり、高いスワップ使用率とメモリ競合の問題が発生します。

これらのユースケースをトラブルシューティングするには、どのプロセスまたはクエリが大量の PGA を使用しているかを特定します。次のクエリを実行して、プロセスごとのプログラム領域の割り当てを表示します。

SQL> SELECT spid, program, round(pga_max_mem/1024/1024) max_MB, round(pga_alloc_mem/1024/1024)alloc_MB, round(pga_used_mem/1024/1024) used_MB, round(pga_freeable_mem/1024/1024) free_MB FROM V$PROCESS ORDER BY 3;

次のクエリを実行して、バックグラウンドプロセスを除いたユーザーセッションの PGA 別のメモリ使用率を表示します。

SQL> SELECT sum(p.pga_max_mem)/1024/1024 "PGA MAX MEMORY OF USER SESSION (MB)" FROM v$process p, v$session s WHERE P.ADDR = S.paddr and s.username IS NOT NULL;

次のクエリを実行して、セッションごとの PGA 別のメモリ使用率と、各セッションで実行されるクエリを表示します。

SQL> SELECT s.username, p.pga_max_mem/1024/1024 "PGA MEMORY OF USER SESSION (MB)", q.sql_text FROM v$process p, v$session s, v$SQL q WHERE P.ADDR = S.paddr AND s.username IS NOT NULL AND s.sql_id = q.sql_id ORDER BY 2;

PGA による高メモリ使用率を減らすには、次の方法の 1 つまたは複数を使用します。

  • PGA_AGGREGATE_LIMIT の値を制限します。これにより、インスタンスのメモリ不足を防ぐことができます。ただし、プロセスに余分な PGA メモリが必要な場合、接続に失敗する可能性があります。
  • SGA_TARGET 値を適切に減らします。これにより、 PGA_AGGREGATE_TARGET は、メモリ競合の問題を発生させることなく、PGA_AGGGEGATE_LIMIT の値まで増やすことができます。
  • インスタンスクラスのサイズを、より多くのメモリを持つ大きなインスタンスサイズに増やします。

5.    前述の手順で説明したメモリパラメータをチューニングした後、データベースのパフォーマンスをモニタリングし、データベースアドバイザリビューを確認します。メモリパラメータを制限するとパフォーマンスが低下する場合は、インスタンスサイズを増やしてみてください。これにより、データベースインスタンスが効率的に動作するためのメモリ使用率が増えます。Performance Insights ダッシュボードを使用して、データベースのワークロードを分析し、メモリ使用率が最も高いクエリを特定できます。次に、メモリ使用率が最大のクエリを調整し、メモリ使用量を減らすことができます。


Oracle ドキュメントのメモリアーキテクチャ

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?