バイセル Tech Blog

バイセル Tech Blogは株式会社BuySellTechnologiesのエンジニア達が知見・発見を共有する技術ブログです。

NewRelicを使ったAPI速度改善手法

テクノロジー戦略本部の市田です。

普段の業務では社内基幹システムのAXISの開発を主に行っています。

AXISグループでは最近APIの速度改善に取り組みましたので、使った技術や改善までの流れを紹介します。

AXISグループについて知りたい方は以下の記事を参考にしてください。

tech.buysell-technologies.com

経緯

AXISがリリースされてから2年ほど経ち、数百万レコードのデータが存在するテーブルが出てきて、明らかに処理が遅い機能が増えてきました。時には処理が終わるまで数十秒かかることもあり、ユーザの業務に大きな影響が出ていました。

そこで私たちはユーザが効率よく業務が進められるようにAPIの速度改善を行うことにしました。

改善すべきAPIを見つける

まずは、速度改善を行う必要のあるAPIを洗い出すことにしました。そこで使ったのがNewRelicというSaaSです。

newrelic.com

AXISはバックエンドでRuby on Railsを使っていますが、RailsでNewRelicを使うにはgemのnewrelic_rpmを導入すると簡単です。

github.com

NewRelicを使えばAPIの応答時間やリクエスト数などを可視化することができます。上記のgemを導入すると本番環境や開発環境用のサイトが作られ、ブラウザ上でAPIの分析ができます。

以下の棒グラフでは「あるAPIの1日の合計応答時間が全APIの1日の合計応答時間の何%を占めているか」を知ることができます(APIの詳細はぼかして見えなくしています)。このグラフの上位のAPIは簡単に言えば「何回もリクエストされるし、処理が終わるまで遅い」ということです。

ということで、このグラフの上位のAPIを改善することにしました。

f:id:bst-tech:20201221222159p:plain

NewRelicのtransactionのtop画面

ちなみに、別の画面ではリクエスト数・平均応答時間・最大応答時間・合計応答時間などを表で見ることもできます。csvでダウンロードもできるので、独自の分析をしたい時にも便利ですね。

f:id:bst-tech:20201221223038p:plain

API別のレスポンスタイムに関する情報一覧

遅い原因を突き止め、対応策を決める

さて、対象のAPIが決まったので原因を調べ、どう改善していくのかを決めます。

NewRelicでは一定時間より遅いリクエストの詳細な分析を見ることができます。以下はあるAPIの特に遅いリクエストの一覧です。1回7秒以上かかっているリクエストがありますね...

f:id:bst-tech:20201221222349p:plain

あるAPIにおける応答時間が長いリクエスト一覧

詳細を見ると、応答時間の内訳がグラフで表示されます。ぼかしている箇所には「controller名#アクション名」や「 DBMS名(PostgreSQLやMySQLなど)+テーブル名+処理」が表示されています。このリクエストは何百回もfind(SQLでいうとSELECT)が実行されているので、N+1問題が発生していることが分かります。

f:id:bst-tech:20201221222505p:plain

リクエストの何に時間がかかっているのか原因別割合

また、「どのクエリが何回実行され合計何秒かかっているのか」も見ることができます。

f:id:bst-tech:20201221222851p:plain

リクエストで発生したクエリ一覧

さて、N+1問題が発生しているのが遅い原因だと分かりました。あとは、ローカルで同じAPIを実行してみて、コードのどの箇所でN+1問題が発生しているのかログを見たりコードを読んだりして突き止めて対応策を決定します。その辺は以下の記事を参考にしてください。

tech.buysell-technologies.com

まとめ

このようにして分析を行い対応策を実行しました。結果として、約55時間/月の応答時間を削減することができ、ユーザにも感謝の声をいただきました。

ユーザは待ち時間が減り、その分だけ別の仕事をすることができるので会社にとってもよいことですし、エンジニアにとっても遅いAPIを速くすることは楽しくやりがいがあることだと思います。

バイセルテクノロジーズではエンジニアを募集しています。

もし興味をお持ちいただけましたらぜひご連絡下さい!