Amazon Web Services ブログ
Performance Insights で Amazon RDS for MySQL をチューニングする
Amazon RDS Performance Insights は、Amazon RDS への直感的なチューニングインターフェイスを提供し、RDS データベースのパフォーマンスの問題を発見して調査するのに役立ちます。Performance Insights のルックアンドフィールは、RDS for MySQL、RDS for PostgreSQL、Amazon Aurora など、すべてのデータベースエンジンタイプで共通です。けれども、エンジンはどれも実装の点で少し異なります。
Performance Insights は、エンジンに関係なく常にデータベースの負荷と上位の SQL を表示できます。エンジンはどれも、拡張データの保持や Amazon CloudWatch との統合など、Performance Insights の機能をサポートしています。ただし、データベースエンジンの種類によっては、 Performance Insights はエンジンのネイティブパフォーマンス計測に基づいてわずかに異なる情報を表示します。
たとえば、PostgreSQL との互換性を持つ Aurora では、データベースの負荷が PostgreSQL 10 の待機イベントによって細分化されています。MySQL 互換性 と RDS MySQL を備えた Aurora では、 MySQL Performance Schema 待機イベントによって細分化された負荷が表示されます。Performance Insights は、各エンジンタイプのネイティブ待機イベント計測を待機イベント用に消費することにより、各エンジンのネイティブパフォーマンス計測に忠実でありながら、各エンジンタイプ間で同様のルックアンドフィールを維持することができます。
2018 年 8 月 28 日、バージョン 5.7.22 以上、および db.t2 を除くすべての DB インスタンスクラスについて、Performance Insights for RDS MySQL を発表しました。Aurora MySQL と RDS MySQL のネイティブパフォーマンス計測は MySQL Performance Schema によって提供されるため、Performance Insights は MySQL Performance Schema が有効な場合に最適に動作します。
DB インスタンスの RDS パラメータグループを使用して、 MySQL Performance Schema を有効にしていないのかもしれません。この場合、Performance Insights を有効にすると、MySQL Performance Schema が自動的に有効化され、設定されます。Performance Insights で MySQL Performance Schema を使用する方法の詳細については、Amazon RDS ユーザーガイドの [Performance Insights を有効にする] をご覧ください。
データベースの負荷
Performance Insights の中心的な指標は、データベースの負荷と呼ばれるものです。DB 負荷は、データベースシステムの全体的なパフォーマンスの状態を、システム上のストレスレベルを反映する単一のメトリックに集約します。DB 負荷の計算方法の詳細については、Amazon RDS ユーザーガイドの [Amazon RDS Performance Insights の使用] をご覧ください。
Performance Insights の上位部分を構成する DB 負荷グラフは、待機、SQL、ホスト、およびユーザーの 4 つのディメンションのいずれかで細分化された負荷を表示できます。グラフの最も一般的なディメンションは待機です。これは、データベースエンジン中のどのような種類のアクティビティが負荷を発生させているかを示しています。負荷グラフの濃い色のバンドは、最も負荷を発生させている待機タイプを示しています。
時間枠を選択するには、グラフの右上にある後続の時間枠の 1 つを選択するか、グラフの任意の部分をクリックしてドラッグして拡大します。MySQL の待機イベント名は特に記述的なものではないので、最も一般的なものを Amazon Aurora MySQL Reference に文書化します。このドキュメントは Aurora MySQL 用ですが、これらのイベントの説明は RDS MySQL にも当てはまります。AWS のドキュメントでカバーされていない待機イベントについては、MySQL ドキュメントの [Performance Schema Instrument 命名規則] をご覧ください。
例として、RDS MySQL 上で動作する sysbench OLTP ワークロードに関する Performance Insights の 1 時間後の DB 負荷グラフを次に示します。 ワークロードは、定常状態の読み取り負荷の高いワークロードです (読み取りと書き込みの比率は 90:10)。したがって、それは OLTP アプリケーションの場合はかなり一般的で、通常のワークロードが Performance Insights ではどのように見えるかを示します。
グラフから、DB 負荷の支配的な原因が待機イベント io/table/sql/handler
にあることがわかります。AWS ドキュメントは、これが I/O 待機イベントのテーブルであることを示しています。このワークロードを確認すると、CPU や I/O などの基本的なホストリソースを消費することによって、正常で健全なワークロードが負荷を発生させていることがわかります。これらのリソースの途中にボトルネックはなく、システムはその作業を行うことができます。
MySQL Performance Schema を使用しない場合はどうでしょうか?
意図的に MySQL Performance Schema を無効にすると、 Performance Insights は引き続き実行はされますが、劣化モードで実行されます。DB 負荷と上位の SQL を表示することは引き続きできます。けれども、Performance Insights で表示されるのは、MySQL Performance Schema の待機イベントではなく、MySQL のプロセス状態です。これらは、show processlist
コマンドの状態
列で通常見られる値です。
上位 10 の SQL ステートメントダイジェスト
[Performance Insights] ページの下部には、負荷グラフに表示されている期間の DB 負荷で見た上位 10 の SQL ステートメントダイジェストのリストが表示されます。このリストは、システムに最も影響を与える SQL ステートメントを特定するのに役立ちます。そのため、チューニング作業をどのように集中させるかを知ることができます。Performance Insights を使用すると、サポートされている他のディメンション (待機、ホスト、またはユーザー) の上位 10 を選択して表示することもできます。しかし、上位 10 のリストの最も一般的なディメンションは SQL です。
MySQL ステートメントダイジェストは、データベース内で実行されている SQL の簡略化されたバージョンであり、常に変化するリテラル値が疑問符で置き換えられます。ダイジェストを使用すると、Performance Insights は、何百何千のほぼ同じ SQL ステートメントの影響を集計できます。ダイジェストでは、これらのステートメントの真の影響を上位 10 のリスト内の単一論理 SQL ステートメントとして表示できます。
問題の診断
DB 負荷メトリックは、データベースのパフォーマンス条件が低下した場合に明らかになります。次の負荷グラフについて考えてみましょう。
このグラフは、io/table/sql/handler
の待機イベントで負荷が上昇している期間によって中断された定常状態のワークロードを示しています。前に示したように、このイベントは I/O イベントです。この間、4 つから 8 つのデータベース接続が主に I/O 上で待機状態になっていました。問題は、その原因です。答えにたどり着くには、先ずグラフをクリックしてドラッグすることで問題の期間を拡大します。
ズームインすると、I/O 待機時間の上昇に最も深く関わっていた SQL ステートメントが表示されます。
問題の期間中、上位の SQL は where 句のない大容量テーブルを更新したものです。このような操作は大量の I/O を使用する可能性が高く、結果として通常のワークロードが競合します。この SQL に原因があるということを知ることで、問題の所在の調査を開始することができます。これを行うには、スライス別ドロップダウンメニューをクリックし、[ユーザー] を選択します。
DB 負荷をユーザーごとに細分化すると、特定の 1 人のユーザーが問題のあるクエリを実行していることがすぐにわかります。そのユーザーは負荷が急上昇している間のみ表示されます。上位の SQL リストでは、そのユーザーが問題のクエリを例外なく実行していることも確認できます。
結論
Performance Insights は、MySQL や PostgreSQL などのオープンソースデータベースではあまり一般的ではないけれども、Oracle などの商用データベースエンジンでは一般的な負荷を視覚化し、細分化するアプローチを RDS MySQL にもたらします。このアプローチはオープンソースエンジンのユーザーにとっては目新しいことかもしれませんが、パフォーマンスが退行する原因を簡単かつ直観的に発見する方法を提供します。
Performance Insights には、チームが今後数か月および数年間にリリースすることを熱望している拡張機能が数多くあります。 フィードバックを提供したり、質問をしたり、機能強化をリクエストしたりすることをご希望の方は、メールでご連絡ください。
著者について
Jeremiah Wilton は アマゾン ウェブ サービスのRelational Database Services (RDS) チームのプリンシパルデータベースエンジニアです。
Szymon Komendera は アマゾン ウェブ サービスの Relational Database Services (RDS) チームのデータベースエンジニアです。