Cloud SQL Insights でクエリ パフォーマンスのトラブルシューティング スキルが向上
Google Cloud Japan Team
※この投稿は米国時間 2021 年 1 月 29 日に、Google Cloud blog に投稿されたものの抄訳です。
アプリケーション パフォーマンスの問題の診断とトラブルシューティングは、データベースが関係している場合は特に困難で時間がかかる可能性があります。デベロッパーは多くの場合、複数の不便なツールを使って問題を特定、診断する必要に迫られています。現在 Cloud SQL for PostgreSQL で利用可能な Cloud SQL Insights は、セルフサービス方式でアプリケーション中心のモニタリングと診断を実行できる単一の UI をデベロッパーに提供する新しい機能です。Cloud SQL Insights を使用して、マイクロサービス ベースのアプリケーションで発生したパフォーマンスの問題の原因を特定する方法を見ていきましょう。
調査対象の問題
こちらは、複数のコンポーネントで構成されているカーシェアリング アプリケーションです。顧客は、配車のリクエスト、乗車料金の支払い、顧客注文ダッシュボードの表示などができます。ドライバーは、割り当てられた配車リクエストの確認、乗車料金の受け取り、ドライバー ダッシュボードの表示などができます。アプリケーションは Django を使用してビルドされ、Cloud SQL 上の PostgreSQL データベースに接続されます。
このアプリケーションを使用している一部のドライバーから、午後 6 時頃から乗車料金の請求時に問題が発生しているという報告を受けました。Cloud SQL Insights ダッシュボードを使用して、問題の原因を特定できるかどうかを確認しましょう。
クエリ分析情報ダッシュボードにアクセスする方法
データベース インスタンスの [概要] セクションから、[クエリ分析情報] セクションにアクセスするには、左側のナビゲーションの [クエリ分析情報] をクリックするか、グラフの下にある [クエリ分析情報] に関するメッセージをクリックします。
最初のビューには、すべての上位クエリに対するデータベース負荷のグラフが表示されます。グラフには、CPU 容量、CPU と CPU 待機、IO 待機、ロック待機に関する情報が含まれています。これらの指標の意味、指標の保存場所、パフォーマンスへの影響について詳しくは、ドキュメントをご覧ください。このビューは、データベース、ユーザー、クライアント アドレス、日時の範囲などの条件でフィルタできます。この例で使用しているインスタンスには単一のデータベースと単一のユーザーしか含まれていませんが、データベースやユーザーが複数存在する場合にこれらのフィルタ オプションを使うと、問題の原因を絞り込むことができます。
午後 6 時頃に何かが発生し始め、負荷と待機時間が急増したことが一目でわかります。
最も負荷の高いクエリの確認
ページを少し下にスクロールすると、QUERIES テーブルに、選択した時間範囲の正規化されたクエリが表示されます。テーブル内のクエリは、合計実行時間でソートされています。テーブル内の最初のクエリの合計実行時間が、他のクエリよりはるかに長いことがわかります。
クエリをクリックすると、そのクエリの詳細情報(そのクエリのデータベースの負荷、クエリのレイテンシ、クエリプランのサンプル、トップユーザーなど)を表示できます。このアプリケーションは ORM を使用してビルドされているため、アプリケーションのどの部分がそのクエリに関係しているかはわかりません。ただし Cloud SQL Insights の [上位のタグ] セクションを確認すると、関係しているクエリを特定できる場合があります。
アプリケーションでクエリの負荷が発生している場所の特定
QUERIES テーブルから TAGS テーブルに切り替えると、ビジネス ロジックでタグ付けされたクエリのリストが表示され、アプリケーションにより一層フォーカスしたビューになります。Cloud SQL Insights では、オープンソース ライブラリ SQL Commenter が作成されています。このライブラリは、フレームワークと ORM から SQL を拡張するためのインストルメンテーションおよびラッパーを提供します。このアプリケーションは、サポートされている ORM の 1 つを使用しているため、アプリケーション コードを変更しなくても、クエリが自動的にタグ付けされます。コントローラ(Django の場合はビュー)とルートを確認できるため、クエリの負荷をより簡単に特定し、問題が発生している可能性のある場所を特定できます。
テーブルの最初の行を見ると、アプリケーションの「demo/charge」ルートからアクセスされる payment_charge ビューに最も時間がかかっていることがわかります。
さらに詳しく調査するには、TAGS テーブルの最初のエントリをクリックします。これにより、特定のアプリケーション タグに関する詳細情報(タグの詳細、クエリプランのサンプル、クエリのレイテンシ、そのタグのデータベースの負荷、上位のクライアント アドレスとユーザーなど)を確認できます。
クエリの実行が遅い理由
クエリプランのサンプルのグラフでいずれかのドットをクリックすると、クエリプランが表示されます。クエリプランには、PostgreSQL が内部でどのようにクエリを実行しているかが示されるため、どの処理が速度低下の原因であるかを簡単に判断できます。
速度低下を引き起こしているアプリケーション コードの絞り込み
前述のように、アプリケーションは ORM を使用しているため、アプリケーションのどの部分がこのクエリを生成しているかはわかりません。組み込みのエンドツーエンド トレースを使うと、さらに詳しく調査できます。[エンドツーエンド] タブをクリックすると、コンテキスト内のトレースが表示されます。
上のスクリーンショットからわかるように、HTTP 500 エラーの発生源は demo_views.payment_charge です。この時点で、payment_charge ビューに問題があるという十分な証拠があり、コードを確認すればさらに詳しく調査できます。Cloud SQL Insights は、アプリケーション コードで問題の原因として考えられるものを絞り込むことができるため、ここで役立ちました。その結果、リソースを大量に消費する非効率的なアクションを特定し、修正することができました。このアクションは、1 日のうちの特定の時間に、多くのユーザーに同時に課金している場合に payment_charge で発生していました。
次のステップ
この投稿では、Cloud SQL Insights を使用して、アプリケーションのパフォーマンスの問題の診断とトラブルシューティングをすべて 1 つの直感的な UI から行う方法について説明しました。この方法は、Codelab を使って試すことができます。さらに詳しく学びたい場合は、ドキュメントで機能に関する説明をご覧ください。
-Cloud デベロッパー アドボケイト Jan Kleinert