Amazon RDS for MySQL または Amazon Aurora MySQL インスタンスの CPU 使用率が高い場合のトラブルシューティングと解決方法を教えてください。

所要時間3分
0

MySQL DB インスタンス用の Amazon Relational Database Service (Amazon RDS) または Amazon Aurora MySQL 互換エディションインスタンスの CPU 使用率が高くなっています。CPU 使用率が高い場合のトラブルシューティングと解決方法を教えてください。

簡単な説明

CPU 使用率の増加は、ユーザーが開始する高負荷なワークロード、複数の同時クエリ、長時間実行されるトランザクションなど、いくつかの要因によって引き起こされる可能性があります。

Amazon RDS for MySQL インスタンスの CPU 使用率の原因を特定するには、以下のアプローチを確認してください:

  • 拡張モニタリング
  • Performance Insights
  • ワークロードの CPU 使用率の原因を検出するクエリ
  • 監視が有効になっているログ

原因を特定したら、ワークロードを分析して最適化し、CPU 使用率を低減させます。

解決策

拡張モニタリングを使用する

拡張モニタリングでは、オペレーティングシステム (OS) レベルのビューを提供します。このビューは、CPU 負荷が高くなっている原因を詳細なレベルで特定するのに役立ちます。例えば、負荷平均、CPU 配分 (System% または Nice%)、OS プロセスリストを確認できます。

拡張モニタリングを使用すると、1、5、および 15 分間隔で loadAverageMinute データを確認できます。負荷平均が vCPU の数よりも大きい場合は、インスタンスが高負荷の状態であることを示しています。また、負荷平均が DB インスタンスクラスの vCPU の数より小さい場合、CPUスロットリングがアプリケーションのレイテンシーの原因ではない可能性があります。CPU 使用率の原因を診断する際に誤検出を避けるためにも、負荷平均を確認してください。

たとえば、CPU 制限に達した 3000 プロビジョンド IOPS の db.m5.2xlarge インスタンスクラスを使用している DB インスタンスがある場合は、以下のサンプルメトリクスを確認して、高い CPU 使用率の根本原因を特定できます。次の例では、インスタンスクラスに 8 個の vCPU が関連付けられています。同じ平均負荷で 170 を超えるということは、測定された時間枠の間、マシンが重い負荷を受けていることを示します。

負荷の平均 (分)

15170.25
5391.31
1596.74

CPU 使用率

ユーザー (%)0.71
システム (%)4.9
Nice (%)93.92
合計 (%)99.97

注:Amazon RDS では、DB インスタンスで実行されている他のタスクよりもワークロードの優先度が高くなります。これらのタスクに優先順位を付けるには、ワークロードタスクの ** Nice 値を高くします。そのため、拡張モニタリングでは、 Nice% ** はワークロードがデータベースに対して使用している CPU の量を表します。

拡張モニタリングを有効にすると、DB インスタンスに関連付けられている OS プロセスリストも確認できます。拡張モニタリングには、最大 100 のプロセスが表示されます。これにより、CPU とメモリの使用量に基づいて、パフォーマンスに最も大きな影響を与えるプロセスを特定できます。

拡張モニタリングのオペレーティングシステム (OS) ** プロセスリストセクションで、 OS ** プロセスと ** RDS ** プロセスを確認します。mysqld プロセスまたは Aurora プロセスの CPU 使用率を確認します。これらのメトリックは、CPU 使用率の増加が OS によるものか RDS プロセスによるものかを確認するのに役立ちます。または、これらのメトリクスを使用して、mysqld または Aurora が原因で発生した CPU 使用量の増加を監視することもできます。また、CPU使用率のメトリックを確認することで、CPU使用率の区分を確認することもできます。詳しくは、「拡張モニタリングによる OS メトリクスの監視」を参照してください

**注:**パフォーマンススキーマを有効にすると、OS スレッド ID をデータベースのプロセス ID にマップできます。詳細については、「十分なメモリがあるのに Amazon RDS DB インスタンスがスワップメモリを使用するのはなぜですか?」を参照してください。

Performance Insights の使用

Performance Insights を使用すると、インスタンスで実行されていて CPU 使用率が高いクエリを正確に特定できます。まず、 MySQLのPerformance Insights 有効にします 。その後、Performance Insights を使用してワークロードを最適化できます。データベース管理者に必ず相談してください。

Performance Insightsで使用できるデータベースエンジンについては、「Amazon RDS のPerformance Insightsによる DB 負荷のモニタリング」を参照してください

クエリを使用してワークロードの CPU 使用率の原因を検出する

ワークロードを最適化する前に、問題のあるクエリを特定する必要があります。CPU 使用率が高い問題が発生しているときに次のクエリを実行すると、CPU 使用率の根本原因を特定できます。次に、ワークロードを最適化して CPU 使用率を減らします。

SHOW PROCESSLIST コマンドは、MySQL インスタンスで現在実行されているスレッドを表示します。場合によっては、同じステートメントのセットが完了せずに実行され続けることがあります。この場合、後続のステートメントは最初のステートメントのセットが終了するまで待つ必要があります。これは、InnoDB の行レベルのロックによって同じ行が更新される可能性があるためです。詳細については、MySQL ウェブサイト上の「SHOW PROCESSLIST ステートメント」を参照してください。

SHOW FULL PROCESSLIST;

注:****SHOW PROCESSLISTクエリをプライマリシステムユーザーとして実行します。プライマリシステムユーザーではない場合、MySQL インスタンスで実行されているすべてのスレッドを表示するには、** MySQL PROCESSサーバー管理権限が必要です。管理者権限がない場合、 SHOW PROCESSLIST**は使用している MySQL アカウントに関連付けられているスレッドのみを表示します。

**INNODB\ _TRX ** テーブルは、読み取り専用トランザクションではない現在実行中のすべての InnoDB トランザクションに関する情報を提供します。

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

**INNODB\ _LOCKS ** テーブルは、InnoDB トランザクションが要求したが受け取っていないロックに関する情報を提供します。

MySQL 5.7 またはそれ以前の場合:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

MySQL 8.0 の場合:

SELECT * FROM performance_schema.data_locks;

**INNODB\ _LOCK\ _WAITS ** テーブルは、ブロックされた InnoDB トランザクションごとに 1 つ以上の行を提供します。

MySQL 5.7 またはそれ以前の場合:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

MySQL 8.0 の場合:

SELECT * FROM performance_schema.data_lock_waits;

次のようなクエリを実行すると、待機中のトランザクションと、待機中のトランザクションをブロックしているトランザクションを確認できます。詳細については、MySQL Web サイトの 「InnoDBトランザクションの使用とロック情報」を参照してください。

MySQL 5.7 またはそれ以前の場合:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_trx_id;

MySQL 8.0 の場合:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

**SHOW ENGINE INNODB STATUS ** クエリは、標準の InnoDB モニタから InnoDB ストレージエンジンの状態に関する情報を提供します。詳細については、MySQL ウェブサイト上の「SHOW ENGINE ステートメント」を参照してください。

SHOW ENGINE INNODB STATUS;

SHOW\ [グローバル | セッション] ステータスには、サーバーのステータスに関する情報が記載されています。詳細については、MySQL ウェブサイトの「SHOW STATUS ステートメント」を参照してください。

SHOW GLOBAL STATUS;

**注:**これらのクエリは Aurora 2.x (MySQL 5.7)、Aurora 1. x (MySQL 5.6)、MariaDB 10.x でテストされました。さらに、INFORMATION\ _SCHEMA.INNODB\ _LOCKS テーブルは MySQL 5.7.14 以降サポートされなくなり、MySQL 8.0 で削除されました。performance_schema.data_locks テーブルが INFORMATION_SCHEMA.INNODB_LOCKS テーブルに取って代わります。詳細については、MySQL ウェブサイト上のdata_locks テーブルを参照してください。

ログの分析と監視の有効化

ログを分析する場合、または Amazon RDS for MySQL でモニタリングを有効にする場合は、以下の方法を検討してください。

  • MySQL 一般クエリログを分析して、特定の時間に mysqld が何をしているのかを確認します。また、クライアントがいつ接続または切断されたかに関する情報など、特定の時間にインスタンスで実行されているクエリを表示することもできます。詳細については、MySQL Web サイト上の「一般クエリログ」を参照してください。
    **注:**一般クエリログを長期間アクティブにすると、ログがストレージを消費し、パフォーマンスのオーバーヘッドが増える可能性があります。
  • MySQL スロークエリログを分析して、** long\ _query\ _time**に設定した秒数よりも実行に時間がかかるクエリを見つけます。また、ワークロードを確認してクエリを分析し、パフォーマンスとメモリ消費量を改善することもできます。詳細については、MySQL Web サイト上の「スロークエリログ」を参照してください。**ヒント:**スロークエリログまたは一般クエリログを使用する場合は、パラメータ log_outputFILE に設定します。
  • MariaDB 監査プラグインを使用してデータベースアクティビティを監査します。たとえば、データベースにログオンしているユーザーや、データベースに対して実行されたクエリを追跡できます。詳細については、「MariaDB 監査プラグインのサポート」を参照してください。
  • Aurora for MySQL を使用している場合は、高度な監査も使用できます。監査を行うと、ログに記録するクエリのタイプをより細かく制御できます。これにより、ロギングのオーバーヘッドが軽減されます。
  • innodb_print_all_deadlocks パラメータを使用して、デッドロックとリソースロックを確認します。このパラメータを使用して、InnoDB ユーザートランザクションのデッドロックに関する情報を MySQL エラーログに記録できます。詳細については、MySQLウェブサイト上のinnodb_print_all_deadlocks を参照してください。

高い CPU ワークロードの分析と最適化

CPU 使用率を増加させているクエリを特定したら、ワークロードを最適化して CPU 使用量を削減します。

ワークロードに必要のないクエリが表示された場合は、次のコマンドを使用して接続を終了できます。

CALL mysql.rds_kill(processID);

クエリのプロセス ID を確認するには、SHOW FULL PROCESSLIST コマンドを実行します。

クエリを終了したくない場合は、EXPLAIN を使用してクエリを最適化してください。EXPLAIN コマンドは、クエリの実行に関連する個々のステップを表示します。詳細については、MySQL Webサイト上の「EXPLAIN によるクエリの最適化」を参照してください。

プロファイルの詳細を確認するには、PROFILING を有効にします。PROFILING コマンドは、現在のセッション中に実行されているステートメントのリソース使用状況を示すことができます。詳細については、MySQL ウェブサイト上の「SHOW PROFILE ステートメント」を参照してください。

テーブルの統計情報を更新するには、ANALYZE TABLE を使用してください。ANALYZE TABLE コマンドは、オプティマイザがクエリを実行する適切なプランを選択するのに役立ちます。詳細については、MySQL ウェブサイト上の ANALYZE TABLE ステートメントを参照してください。


関連情報

Amazon RDS for MySQL

Amazon RDS for MariaDB

Amazon RDS MySQL DB インスタンスのログをアクティベートしてモニタリングする方法を教えてください。

Performance Insights を使った Amazon RDS for MySQL のチューニング

コメントはありません

関連するコンテンツ