1. はじめに
コンチア~!バックエンドエンジニアの石垣です。
2024年7月、弊社サービス「クロスオーダー」は、当月利用店舗数が90,000店舗を突破しました。
(※)当月利用店舗数:これまでの累計ではなく、当月でクロスオーダーを利用し発注してくださっている店舗数を指します。
過去、弊社テックリードたけじいさんが投稿した「弊社が急成長しそうなのでAPM(NewRelic)を検討してみた」というブログでは、継続的なデータの増加や、アプリケーションやデータベースへの負荷の高まりに直面していることを取り上げました。
それ以降、データ量はさらに増加し続けており、負荷も増大しています。今回の記事では、過去に導入したNewRelicを活用し、どのようにパフォーマンス改善に役立てているかを具体的にお話ししていきます。
2. 具体的な監視ツール
弊社ではデータベースパフォーマンスのチューニングを行う際は、NewRelicとAmazon RDS Performance Insightsを活用しています。
これらのツールを組み合わせて、継続的にデータベースパフォーマンスを最適化し、データ増加に対応したチューニングを行っています。
NewRelic
NewRelicでは、どのプログラムのどの処理に時間がかかっているかを詳細に分析できます。特に重要なのは、データベース処理のボトルネックを明らかにする機能です。SQLクエリがどのように実行され、どこで時間がかかっているかを一目で確認できるため、効率的なチューニングが可能です。
これを利用することで、スロークエリやリソースの使いすぎに早期に気付き、パフォーマンス改善のアクションをすぐに取れるのが強みです。
Amazon RDS Performance Insights
Amazon RDS Performance Insightsは、RDSのパフォーマンスをリアルタイムで可視化し、リソースの使用状況やデータベースの負荷を定量的に把握できます。これにより、データベースのパフォーマンスボトルネックを迅速に特定し、CPU使用率やIO待ち時間などの主要メトリクスをリアルタイムで監視できます。
3. データ増加に伴う対応
データ量が増加し続ける中、パフォーマンスの維持は簡単ではありませんが、弊社ではツールを活用しながら、日々のチューニングを通して最善を尽くしています。
パフォーマンス最適化のプロセス
NewRelicやAmazon RDS Performance Insightsを活用して、以下のステップでボトルネックを特定します。
1. トレース分析
NewRelicのTransactionsというセクションを活用します。
レスポンス平均時間が遅いエンドポイントを特定し、その詳細ページで具体的にどの処理で時間がかかってしまっているかを確認します。
Transactionsにおいて、リクエストの処理時間×リクエスト数が多い順に表示します
確認したいTransactionを選択し、詳細からレスポンス時間やクエリを確認します。 Call Countはクエリ実行回数です。Call Countが複数回記録されている場合、N+1が発生している可能性があります。
2. SQLクエリの検証
Performance Insightsを活用してスロークエリや頻繁に呼び出されるクエリを特定し、システムへの負荷を確認します。同時に、NewRelicのTransactions機能を使い、クエリがどのAPIから実行されているかを逆引きし、APIレベルでの最適化を進めます。
また、WriterとReaderインスタンスの適切な負荷分散も確認し、読み取り専用クエリが正しくReaderインスタンスに割り振られているかをチェックします。
以下の例では、IN句に大量の要素が渡されていたため、インデックスが効かず、フルスキャンでリソースが過剰に消費されていました。
具体的な改善
クエリチューニングはもちろん重要ですが、APIにおいてはレスポンスの内容を見直し軽量化を図ることも有効でした。
例えば、必要のないデータを省くことでレスポンスサイズを小さくし、通信コストを削減したところ、
レスポンスタイムを2,819ms -> 548ms に改善することができました⭐️
また、UI側での最適化や、ユーザーに見えない部分での機能の簡素化も場合によっては効果的です。特にパフォーマンスが重要なシーンでは、機能の削減やユーザー体験の見直しが大きな改善をもたらすこともあります。
弊社では、パフォーマンス改善において、PMや時にはCSの方々とも協力し、その時々の状況に応じた最適な改善方法を相談しながら進めています。
4. まとめ
データが増加し続ける環境下で、パフォーマンスを保つためには、定期的な監視と継続的な最適化が不可欠です!NewRelicやAmazon RDS Performance Insightsのようなツールを活用しながら、データベースのパフォーマンスを細かくチェックし、必要に応じてチューニングを施していくことで、長期的に安定したシステムを運用することが可能です。
今回の記事が、みなさんのシステムパフォーマンス改善の一助となれば幸いです。
最後に
継続的な改善を進めながら、新しい機能をどんどん実装していく。そんな環境がクロスマートでは整っています! 成長し続ける素晴らしいプロダクトを一緒に作りませんか?
興味のある方はぜひご連絡ください🎵