はじめに
最近プロジェクトで、CloudSQLのパフォーマンス問題が発生しました。その時の調査として、特定のクエリに原因がないかを見るためにQueryInsights機能を利用しました。
結果的に、パフォーマンス最適化のためにこの機能がとても役立ったので、本記事にQueryInsightsの概要をまとめてみました。
個人的には、CloudSQLインスタンスを作成するなら、よっぽどの理由がない限りQuery Insightsも有効化しておいて良いと思います。(コストも低いのと、問題発生後に有効化しても問題時の分析情報を見ることができないため)
Query Insightsについて
概要
Query Insightsは、CloudSQLの機能の1つという位置付けです。(Cloud Spannerでも利用可能)
機能有効化するだけで、負荷の高いクエリの順位づけ・色々なメトリクスの取得など様々な分析を行ってくれます。
運用中のDBインスタンスに対するクエリ実行状況をかなりいい感じに可視化してくれて、パフォーマンスチューニングの強い味方になります。
良いと思った点(コスト観点)
有効化することによるリスクが非常に低いのが魅力的だと思いました。
- CloudSQLインスタンス単位で有効化できる → 対象を絞ってコスト最適化可能
- QueryInsights機能自体にコストは発生しない。CloudSQLディスクを消費することもない
- 有効化後、無効化すること可能(参考)
留意点
- 見られるデータは直近1週間分のみ
- Cloud Monitoringの料金が発生する(指標はCloudMonitoringにより取得されるため)
- 自プロジェクトでの実績としては、0.1ドル/日程度でかなり低いようでした。ただしクエリの回数が増えると徐々に料金も増加するものと思われます。
指標は Cloud Monitoring に保存されます。API リクエストについては、Cloud Monitoring の料金をご覧ください。
有効化の手順
本当に簡単です。
CloudSQLの対象インスタンス詳細画面→Query Insights
→有効にする
だけです。
3分程度で有効化され、QueryInsightsの画面が表示されました。
得られる情報
全体画面
QueryInsightsの全体画面では、以下情報が見られます。(ドキュメントはこちら)
- データベース負荷推移
- DB負荷が上位のクエリと、その概要
- クエリ実行先DBや実行元DBユーザによりフィルタリングすることも可能
↓例として、現在のプロジェクトはこのような表示となりました。(クエリ文はマスク)
見て一発で分かりますが、一番上のクエリのスキャン行数が異常に多く絞り込みができていないことが原因で、DB負荷を著しく上げていることが判明しました。
クエリごとの詳細画面
各クエリの詳細画面では、以下情報が見られます。(ドキュメントはこちら)
- クエリ文
- 実行先DB
- 実行元DBユーザ
- 特定の時間内でのそのクエリの指標
- 呼び出された回数
- 平均実行時間
- 平均スキャン行数
- 返された平均行数
- クエリのレイテンシ推移
- 95 / 90 / 50 パーセンタイルいずれも見れる
- データベースへの負荷推移
- クエリプラン
その他
QueryInsightsでオプションを有効化することで、以下のような情報も追加で設定できます。
運用に応じて適宜有効化すると良いです。
- クライアントIPアドレスによるフィルタリング
- アプリケーションタグによるフィルタリング
- QueryInsights画面で見れるクエリ文の長さ制限変更(デフォルトは1024バイト)
- 最大サンプリングレートの変更
最後に
調査当初は「インスタンスのスケールアップで対策するしかないな」と考えていました。
しかしながらQueryInsightを利用することで、効率的に負荷原因となるクエリを特定でき、インスタンスのコスト増を避け根本的なクエリ側の改善によりパフォーマンス改善を達成できました。
(またCloudSQLはHA構成もスケールアップ時にダウンタイムが発生するため、それを避けられた点でも良かったです。)