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

十分なメモリがあっても、Amazon RDS DB インスタンスがスワップメモリを使用している理由を知りたいです。

所要時間2分
0

Amazon Relational Database Service (Amazon RDS) DB インスタンスを実行しています。十分な空きメモリを割り当てているにもかかわらず、そのインスタンスが大量のスワップメモリを使用しているため、トラブルシューティングしたいです。

簡単な説明

Linux を実行する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスは、割り当てられたメモリよりも多くのメモリをシステムが必要とする場合にスワップメモリを使用します。詳細については、「M1 および C1 EC2 インスタンスのインスタンスストアスワップボリュームの有効化」を参照してください。ほとんどの RDS DB インスタンスは Linux (SQL Server を除く) を使用しているため、データベースがスワップメモリを使用する場合があります。

RDS DB インスタンスでは、クエリの実行時など、ページが現在アクセスされているときのみ RAM 内にページが必要になります。以前に実行されたクエリによって RAM に読み込まれた他のページは、使われていない場合はスワップ領域にフラッシュされます。オペレーティングシステム (OS) では、ページをメモリ内に強制的に保持するのではなく、古いページをスワップすることがベストプラクティスです。この方法では、今後のクエリに使用できる十分な空き RAM が確保されます。

スワップの使用量をクリアすると、必要なときやページを再ロードするときにスワップを再割り当てするための余分なオーバーヘッドが必要になるため、Linux のスワップ使用量は頻繁にはクリアされません。その結果、RDS DB インスタンスでスワップを使用した場合、それが 1 回のみであっても、SwapUsage メトリクスはゼロには戻りません。Amazon RDS for Oracle でサポートされる HugePages および、Amazon RDS for PostgreSQL 上の HugePages を使用する場合にもスワップメモリを使用できます。HugePages は Linux のデフォルトサイズである 2 メガバイトよりも大きいサイズです。

解決策

RDS DB インスタンスでのスワップ使用に関する動作を把握するには、まずアプリケーションのワークロードに基づいて DB パフォーマンスメトリクスを確認します。Amazon CloudWatch メトリクス FreeableMemory および SwapUsage の両方をレビューし、RDS DB インスタンスの全体的なメモリ使用パターンを確認します。FreeableMemory メトリクスの減少と SwapUsage メトリクスの増加が同時に発生しているかどうかを確認します。これは、RDS DB インスタンスのメモリに負荷がかかっていることを示している場合があります。詳細については、「Amazon RDS for MySQL データベースの空きメモリが少ない場合のトラブルシューティング方法を教えてください」を参照してください。

空きメモリが十分にある場合は、スワップを使用していても RDS DB インスタンスのパフォーマンスには影響しません。空きメモリが常に少ない場合は、RDS DB インスタンスクラスをメモリの多い、大規模なインスタンスクラスに変更してください。

スワップメモリを監視するには、拡張モニタリングを有効化し、1 秒間などの短い間隔でメトリクスをレビューします。拡張モニタリングがホストレベルで統計を収集し、CloudWatch は 60 秒ごとにハイパーバイザーレベルからデータを収集します。拡張モニタリングでは、1 秒間だけ発生した増加または減少を識別し、個々のプロセスで使用されている CPU とメモリを表示します。詳細については、「CloudWatch Logs を使用した OS メトリクスの表示」を参照してください。

Performance Insights を有効にしても、RDS DB インスタンスで過剰にスワップやメモリを消費している SQL イベントや待機イベントを特定できます。Performance Insights はデータベースレベルでデータを収集し、Performance Insights ダッシュボードにデータを表示します。Performance Insights は、データベースのパフォーマンス関連の問題のトラブルシューティングに役立ちます。詳細については、「Amazon RDS での Performance Insights を使用したDB 負荷のモニタリング」を参照してください。

Amazon RDS for MySQL

空きメモリが少ない場合は、SHOW FULL PROCESSLIST を実行し、データベースで実行されているすべてのスレッドを確認します。詳細については、MySQL のウェブサイトで「SHOW PROCESSLIST statement (SHOW PROCESSLIST ステートメント)」を参照してください。SHOW FULL PROCESSLIST で出力されるプロセス ID は、拡張モニタリングで表示されるプロセス ID と一致しません。データベースに関連付けられている DB パラメータグループPerformance_Schema パラメータに変更すると、正しいプロセス ID を確認できます。これは静的パラメータなので、RDS DB インスタンスを再起動する必要があります。

注: ダウンタイムを回避するために、パラメータを変更した後に、トラフィックのピーク時間外にデータベースを再起動してください。

メモリが目標とする使用量に達した際には、次の手順を実行します。

  1. 拡張モニタリングページのプロセス ID をソートすると、CPU を最も多く消費しているプロセスの ID を確認することができます。
  2. 次のクエリを、マスターユーザーで実行します。
    select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G
    例えば、Thread_OS_Id 10374 および 1432 がメモリを最も多く消費している場合は、次のクエリを実行します。
    select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G
    詳細については、MySQL のウェブサイトで「The threads table」(スレッドテーブル) を参照してください。
  3. このクエリの出力から、PROCESSLIST_ID 列を取得します。この列は、SHOW FULL PROCESSLIST のプロセス ID の値と一致するプロセス ID を示しています。
  4. 正しいプロセス ID を取得した後に、、プロセス ID をクエリにマッピングします。プロセス ID を参照し、メモリと CPU の使用率が高くなっている根本原因を特定します。

拡張モニタリングを使用して OS のプロセスを確認します。詳細については、「Viewing OS metrics in the Amazon Aurora and RDS console」(Amazon Aurora と RDS コンソールでの OS メトリクスの表示) を参照してください。

Amazon RDS for PostgreSQL

大量のメモリを消費しているプロセスを特定するには、拡張モニタリングのプロセスリストにあるプロセス ID を、適切なクエリにマッピングします。次の pg_stat_activity ビューを実行することで、プロセスを特定できます。

select * from pg_stat_activity where pid=(the PID of your process);

次に、コンピューティングリソースの消費を軽減するようにクエリを調整します。

Amazon RDS for SQL Server

拡張モニタリングにより、大量のメモリを消費している特定のスレッド ID を識別できる場合があります。スレッド ID は、RDS for SQL Server ではカーネルプロセス ID (KPID) と呼ばれています。

RDS for SQL Server から次のクエリを実行し、KPID に対応するサーバープロセス ID (SPID) を取得します。

select * from sys.sysprocesses where kpid = '<Value of Thread ID from Enhanced Monitoring>' ;

サーバープロセス ID (この例では 69) を取得した後に、次のコマンドを実行して SPID 69 による処理を確認します。

dbcc inputbuffer(69)

Amazon RDS for Oracle

メモリを最も多く消費しているプロセスを特定するには、拡張モニタリングの OS プロセス ID を使用します。次に以下のクエリを実行し、セッションのプロセスアドレスを取得します。

select ADDR from v$process where SPID=OS_PID;

プロセスアドレスを使用して次のクエリを実行することで、データベース内のセッションを識別できます。

select sid,serial#,username, status from v$session where PADDR='<ADDR from above query>';

拡張モニタリングを有効化したら、FreeMemory メトリクスと FreeableMemory メトリクスを比較します。上記のメトリクスが異なる場合は、キャッシュまたは非アクティブなメモリで大量のメモリが使用されていることを示している可能性があります。このメモリ使用量により、スワップ使用率が高くなる可能性があります。場合によっては、キャッシュをクリアする必要があります。キャッシュをクリアする方法の詳細については、「バッファキャッシュのフラッシュ」を参照してください。

注: バッファキャッシュをクリアすると、データベースのパフォーマンスに悪影響が生じる可能性があります。

関連情報

Amazon RDS のモニタリングツール

コメントはありません

関連するコンテンツ