New Relicを用いたキャッシュ効果の推定

はじめに

この記事は、トラストバンク Advent Calendar 2023New Relic Advent Calendar 2023シリーズ3の4日目の記事となります!

こんにちは、今年でサーバーサイドエンジニア3年目となったトラストバンクの@h0r4kです。

今回の記事では、NewRelicのNRQLを利用したリクエストキャッシュの効果推定のプロセスとその際に使用したNRQLについてまとめてみました。

キャッシュ導入の動機とNewRelicによる効果推定を試みた理由

近頃、昨年私がリリースに携わった新規サービスが徐々にスケールしてきており、リリース当初よりもアクセス数が増加してきていました。

これに伴って、リリース当初よりもDBへのアクセス数も増加しており、全体へのパフォーマンス影響を考慮する必要がでてきたため、いくつかのエンドポイントについて、常にDBへのリアルタイムなSELECTが必須ではないものを対象に、Redisキャッシュを適用してみることにしました。

そんな中で、既に過去のアクセスログが集約されておりかつ、NRQLによる柔軟なログ集計が可能なNewRelicを用いて効果推定を行うことにしました。

事前準備と補足

今回の集計では、NRQLのFACET句を利用するため、事前にNewRelicのLogParsingもしくはaparse関数を用いて、url毎に集計が行えるよう準備しておきます。 (今回私はLogParsingで事前準備を行いましたが、おそらくaparseでもできるはずです。できなかったらゴメンナサイ。)

なお、今回はECSの複数コンテナから同一のキャッシュを読み書きしたいため、Elastic Cache(Redis)を使用しており、キャッシュ期間は、キャッシュ対象のエンドポイントの特性上から1分として設定しています。

キャッシュ対象のイメージ

今回キャッシュするのはお礼の品の情報を取得するエンドポイントで、URLの中にお礼の品IDを含んでいます。

GET /products/{お礼の品ID}

※URLはあくまでイメージであり実際のエンドポイントとは異なります。

実際にキャッシュ効果の推定を試みる

では実際にアクセスログからキャッシュ効果を推定してみましょう。

今回は、キャッシュ対象のエンドポイントに対して、ピーク時にどの程度キャッシュが効きそうかを調査します。

ピーク時分間最大アクセス数とその日時を算出

まずは、下記のNRQLを用いて、キャッシュ対象のエンドポイントの分間最大アクセス数とその日時を確認します。 (分間アクセス数を見たいのでTIMESERIESMINUTEに設定しています)

SELECT count(*) FROM Log WHERE 【リクエスト絞り込み条件】 TIMESERIES MINUTE LIMIT MAX SINCE 開始日時 UNTIL 終了日時

ピーク時の重複リクエスト有無の確認

次に、先程確認したピーク1分の中で、実際に重複したリクエストがあったかどうかをざっくり確認します。

SELECT count(*) FROM Log WHERE リクエスト絞り込み条件 FACET url LIMIT MAX SINCE 開始日時 UNTIL 終了日時

今回は、重複したリクエストがあったようなので次のステップに進みますが、もしここで重複したリクエストがなければキャッシュを行っても効果が見込めないので、キャッシュ期間を伸ばせないか等別途検討が必要となります。

ピーク時1分以内に重複してリクエストのあったURLの数を集計

ここでは、ピーク時の1分以内に2回以上リクエストが発生したURLを集計します。

SELECT count(count) AS '重複のあるリクエストの数' FROM (SELECT count(*) FROM Log WHERE リクエスト絞り込み条件 FACET url LIMIT MAX) WHERE count >= 2 SINCE 開始日時 UNTIL 終了日時

ピーク時1分以内に重複してリクエストのあったリクエスト数を集計

次にこちらでは、先程の集計した重複のあったURLに対して、合計で何件のリクエストが発生したのかを集計します。

SELECT sum(count) AS '重複のあるリクエストの実行回数の合計' FROM (SELECT count(*) FROM Log WHERE リクエスト絞り込み条件 FACET url LIMIT MAX) WHERE count >= 2 SINCE 開始日時 UNTIL 終了日時

集まった情報からピーク時のキャッシュヒット率を推定

では実際に集めた情報から、ピーク時のキャッシュヒット率の推測値を算出します。 計算式は下記のとおりです。

ピーク時キャッシュヒット率の推測値 = (ピーク時に重複してリクエストのあったリクエスト数の合計 - ピーク時に重複してリクエストのあったURL数) / ピーク時分間最大アクセス数

なお、今回の記事の検証に利用したデータでは、ピーク時のキャッシュヒット率は約43.96%と算出されました。 (キャッシュ期間を伸ばせばもう少しヒット率も上がりそうですね)

終わりに

今回の記事では、NewRelicの簡単なNRQLを用いてキャッシュ効果を推定してみました。

実際にNRQLを作成してみたところ、案外簡単なNRQLで集計を行うことができましたが、私自身不慣れなのもあり、実際にはNRQLを作成するまでになかなか時間がかかってしまいました。

今回はキャッシュ期間を1分として決め打ちで推定してみましたが、今後はキャッシュ期間を変数化してキャッシュ効果の推定ができれば面白いなと思いました。

最後までご覧いただきありがとうございました!

エンジニア募集

弊社では絶賛エンジニア募集中ですので、気になった方は是非ご連絡ください!

www.wantedly.com