見出し画像

REALITYのパフォーマンスチューニングに取り組んでみた

こんにちは。京都大学のshibukazuと申します。10月から一ヶ月間、GREE Jobsの一環として、REALITY株式会社のインターンシップに参加させていただきました。インターンシップでの取り組みについて簡単に紹介いたします。

インターンシップでの取り組み

今回のインターンシップでは、サーバーサイドエンジニアとして、REALITYのAPIサーバーにおけるパフォーマンス改善に取り組みました!
REALITYではサクサク会というチームの方々が、以下のような目標を掲げ、日々レイテンシの監視やボトルネックのチケット化に取り組んでいます。

全てのAPIについてLatencyの95%ileを原則1.0 sec以内に収める

そのような中で、メンターの方やサクサク会の方々のサポートをいただきながら、以下の2つのAPIの改善に取り組みました。

  • フォローしているユーザーを取得するAPI

  • チュートリアル終了時やライブ終了時に複数のユーザーをまとめてフォローするAPI

フォローしているユーザーを取得するAPIにおける改善

改善前の実装では、フォローしているユーザーの情報を取得する際に、ユーザーテーブルの全カラムを取得するような実装になっていました。サクサク会のメンバーの方の事前調査の結果から、取得するカラムを必要なものだけに限定することによってクエリパフォーマンスが改善するという結果が得られており、その結果に基づき、SELECT時に取得するカラムを限定することで、パフォーマンスを改善することができました。
以下の図は、改善前と改善後の同じ曜日におけるレイテンシを比較した結果になります。レイテンシの99パーセンタイル値が41%高速化しており、特にフォロー・フォロワーが多いユーザーにおいて大幅な高速化を実現することができました。

改善前(青)と改善後(オレンジ)

チュートリアル終了時やライブ終了時に複数のユーザーをまとめてフォローするAPI

改善前の実装では、フォロー対象の各ユーザーに対して、ユーザーフォロー用のクエリを毎回発行しており、N+1問題が生じていました。
そこで、一度のクエリで全ての対象ユーザーに対してフォローを行うことができるように、バルク処理を行う関数やクエリを実装しました。
以下の図は、先ほどと同様に改善前と改善後のレイテンシを比較した図になります。

改善前(青)と改善後(オレンジ)

改善後のレイテンシを表すオレンジ色のグラフが全体的に左側にシフトしており、レイテンシの90パーセンタイル値が71%の高速化という大幅な改善を実現することができました。
また実際に、チュートリアル終了後に複数のユーザーをフォローする場面における処理速度を比較してみたところ、改善前に比べて高速にユーザーのフォローを完了することができていました!

左が改善前、右が改善後

最後に

今回のインターンシップを通じて、パフォーマンスチューニングの重要性はもちろんのこと、監視システムの重要性を痛感しました…。監視システムの構築によりスケール拡大時のパフォーマンス低下を早期に発見することができるようになるため、企業での開発だけでなく、個人開発や小規模な開発においても非常に重要であるということを学びました。

最後に、授業や祝日と重なり、稼働時間があまり確保できない中で、ペアプロ形式で一緒にパフォーマンス改善に取り組んでくださったメンターの方や、様々な場面でサポートしていただいたサクサク会の方々、本当にありがとうございました。

こちらの記事を通じて、REALITYでのインターンシップに興味を持ってくださった方は、ぜひ以下のリンクからインターンシップに応募してみてください!