スキップしてコンテンツを表示

Amazon RDS for Oracle データベースインスタンスで空きメモリが不足したり、スワップ使用率が高くなったりする問題に対処する方法を教えてください。

所要時間2分
0

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 パラメータの値を減らします。

注: これらのパラメータは動的パラメータですが、これらのパラメータを変更するには、フェイルオーバーなしでインスタンスを再起動する必要があります。詳細については、「サポートされている RDS for Oracle インスタンスで 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 ウェブサイトの「Enabling automatic memory management」(自動メモリ管理の有効化) を参照してください。

  2. PGA と SGA によるメモリ使用量を表示するには、次のコマンドを実行します。

    SQL> SELECT (value/1024/1024) CURRENT_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA allocated';SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB,con_id FROM V$SGASTAT group by con_id;

    前回の再起動後に 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 FROMV$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR;
    SQL> SELECT SGA_SIZE,SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROMV$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;

    注: CDB 構成では、V$PGASTAT コマンドはクエリで実行した際の PDB 固有の情報を表示します。

  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_TARGET および MEMORY_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,con_id FROM V$PROCESS ORDER BY 4;

    バックグラウンドプロセスを除くユーザーセッションの PGA によるメモリ使用量を表示するには、次のコマンドを実行します。

    SQL> SELECT sum(p.pga_alloc_mem)/1024/1024 "PGA Allocated MEMORY OF USER SESSION (MB)",p.con_id FROM v$process p, v$session s WHERE P.ADDR = S.paddr and p.background IS NULL group by p.con_id;

    セッションごとの PGA によるメモリ使用量と、各セッションで実行されているクエリを表示するには、次のコマンドを実行します。

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

    注: CDB 構成では、con_id 列でどのコンテナリソースの使用量かを確認します。Non-CDB 構成では、con_id 列は常に 0 です。

    PGA による高いメモリ使用量を減らすには、次の 1 つ以上の方法を使用してください。

    PGA_AGGREGATE_LIMIT の値を制限します。これにより、インスタンスのメモリ不足を防ぐことができます。ただし、プロセスに追加の PGA メモリが必要な場合、接続が失敗する可能性があります。

    SGA_TARGET の値を減らします。これにより、メモリ競合の問題を引き起こすことなく、PGA_AGGREGATE_TARGETPGA_AGGEGATE_LIMIT の値まで増やすことができます。
    インスタンスクラスサイズを、より多くのメモリを備えた、より大きなインスタンスサイズに増やします。

  5. 前述のステップで説明したように、メモリパラメータを調整した後は、データベースのパフォーマンスを監視し、データベースのアドバイザリビューを確認してください。

    メモリパラメータの制限によりパフォーマンスが低下する場合は、インスタンスサイズを増やしてみてください。これにより、データベースインスタンスが効率的に動作するために使用できるメモリが増えます。

    Performance Insights ダッシュボードを使用して、データベースワークロードを分析し、メモリ使用量が最も多いクエリを特定します。次に、メモリ使用量が最も多いクエリを調整して、使用するメモリを少なくします。

関連情報

Memory architecture (メモリアーキテクチャ)(Oracle ウェブサイト)

コメントはありません

関連するコンテンツ