はじめに
New Relic の APM を利用して Database の高負荷状況を調査する機会がありましたので、調査方法をご紹介します。
概要
ある事象があり、調査を実施しました。
調査時の確認としては、以下のような形で実施しました。
- New Relic の APM の Databases からのスロークエリ確認
- 対象スロークエリはどのトランザクションで起きているか
- 対象スロークエリはその他時間ではどれくらいスローか(語彙力)
- 対象スロークエリの解消ポイントがあるか
記載した内容を細かく見ていきます。
詳細
New Relic の APM の Databases からのスロークエリ確認
APM & Services の Databases から当該項目は確認可能です。
database の operations に対して、スロークエリ、時間のかかったクエリを出してくれます。
対象スロークエリはどのトランザクションで起きているか
特定の仕方
上記したスロークエリの一覧から調べたい対象のクエリを選択し、右ペインに表示される内容で、「Time consumption by caller」の内容に注目します。
この中でどこのトランザクションから呼ばれているクエリか、それの経過時間の比率がありますので、大体は多くの時間を占めているトランザクションが主要因になるものと考えられます。
今回以下の画像だとオレンジのトランザクションと考えることができます。
本当にそれか?を確認する
少し戻って、APM & Services の Transactions を確認します。
該当のトランザクションを選択します。
それを表示すると以下のようにでます。
まず Segment breakdown にて先程スロークエリと表示されていたタイミングと一致することを確認します。
次に Breakdown table にてどのテーブルに対するクエリがどの程度トランザクションあたり呼び出されていて、そのテーブルのクエリの応答がそのトランザクション内で占める割合を確認することができます。
これで大体要因となるクエリが特定できると思います。
対象スロークエリはその他時間ではどれくらいスローか
これは単純に対象の時間以外でそのクエリがスロークエリとして表示されるか、を確認します。
例えば、ある使用率がそれほど高くない場合でも、そのクエリが占める割合が多く、スロークエリとされていれば、そのクエリの待ち時間によって、、ある 使用率の上昇が加速したと、考えることができます。
対象スロークエリの解消ポイントがあるか
この機能は今回知ったのですが、対象のクエリに対して、ヒントを表示してくれます。
APM & Services の Databases から対象のクエリを選択します。
更に右ペインに表示される、Slow SQL traces にて遅いクエリの青リンクをクリックします。
これの場合、、
- インデックスが効いていない
- テーブル全体をスキャンしており、数行がスキャンされる場合を除き遅くなる
- 、、、、
というようなことが表示されます。
最終的な解消
今回 APM のこの情報を中心に調査し、無事に解決することができました。
所感
APM でのこういった調査の内容は基本的なところだと思いますが、改めて利用時の確認方法を振り返りました。
Deployment など、まだまだ効率的に使えていない部分がありそうなので、使えそうな方法を模索していきたいと思います。
また、運用面においても、ダッシュボードを整えるなど、より効率的に、調査を行えるように、パフォーマンス改善・安定運用に向けた取り組みを行っていければと思います。