虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

GCP の Cloud SQL Insights で快適なSQLチューニングを行う

Fantiaでエンジニアマネジメントを担当しております。JUです。

今回はブログを書くのが久々にはなるのですが、2021年に追加されたGCPの機能である「Cloud SQL Insights」に関して書いていこうと思います。

規模の大きいサービスを長年運営していって頭を悩ませるのはなんといってもデータベースの負荷です。

「Cloud SQL Insights」はデータベース負荷を簡単にモニタリングできる大変優秀な機能で、自分も大いに助けられています。

本記事にて紹介しますので、ぜひ使っていただきたいなと思います。

Cloud SQL Insights とは

2021年頃にCloud SQLへ追加されたデータベースへのクエリパフォーマンスを検出、診断できる機能です。

負荷の状態や処理が重いクエリをモニタリングすることが可能で、サービス負荷の根本原因の特定をすることが容易になります。

Cloud SQL Insights の始め方

Cloud SQLを新規で立ち上げる場合、MySQLの場合5.7以降のバージョンであればデフォルトで設定項目が存在しています。

gcloudコマンドでCloudSQLを立ち上げる場合は以下のような形となります。

gcloud sql instances create my-instance \
  --tier db-f1-micro --database-version=MYSQL_8_0 \
  --region=us-central --root-password=<PASSWORD> \
  --insights-config-query-insights-enabled

これは最小スペックのMySQL8バージョンで新しいCloudSQLを作成する際のコマンドになります。

最下部の「--insights-config-query-insights-enabled」が Insights の機能を有効にするオプションです。

ダッシュボードの見方

グラフ

設定が有効になっていると、Insightsの画面が見れるようになっています。

そして以下画像のようなグラフがInsightsの画面上部に表示されます。

こちらで最大7日間まで、対象のCloud SQLにおける「負荷」を見ることができます。

「CPUとCPU待機」「IO待機」「ロック待機」の3種類の合計で負荷が見えるようになっており、問題の切り分けが行いやすくもなっています。

上位のクエリ

画面下部には「上位のクエリとタグ」というものがあり、上の画像は「上位のクエリ」です。

クエリは

SELECT * FROM `items` WHERE `items`.`id` = 4;

SELECT * FROM `items` WHERE `items`.`id` = 35;

このようにふたつのクエリが実行されている場合、検出されるクエリとしては

SELECT * FROM `items` WHERE `items`.`id` = ?;

このように変動する値をマスキングして、一種類のクエリとして検出されます。

そうして「実行時間」と「実行回数」の両方を意識した形で、負荷の高いクエリを簡単に見分けることができます。

上位のタグ

上の画像は「上位のタグ」で、クエリ実行時にタグとなるフォーマットのコメントがあれば、更に詳細に負荷となっている箇所の特定が可能です。

一例ですが、Railsでは「activerecord-sql_commenter」というGemを追加することで、自動的にタグとなるフォーマットのコメントを追加できます。

gem "activerecord-sql_commenter", require: "active_record/sql_commenter"

これにより、どのコントローラーとメソッドで実行されたかが検出できます。

「上位のクエリ」ではクエリの種類でしか判別ができませんが、「上位のタグ」でどの処理が多く実行され、負荷になっているかも判別することが可能です。

まとめ

負荷検知においてスロークエリの調査や、大規模データを使った調査作業がこれだけで済むようになります。

どこが負荷となって危ないかも瞬時にわかるため、大規模サービスにおいては入れておいて損はない機能です。

Fantia開発採用情報

虎の穴ラボでは現在、一緒にFantiaを開発していく仲間を積極募集中です!

多くのユーザーに使っていただけるtoCサービスの開発をやってみたい方は、ぜひ弊社の採用情報をご覧ください。

yumenosora.co.jp