ブログ作成者紹介
氏名:川島 充博
所属:開発部
趣味:マラソン、トレイルランニング、亀の飼育
はじめに
Webアプリケーションにおいて、パフォーマンスは非常に重要な要素です。パフォーマンスが悪いと、ユーザーの待ち時間が長くなり、ストレスを感じてしまいます。また、サーバーリソースの無駄な消費につながり、コストアップの原因にもなります。
Railsアプリケーションのパフォーマンスを確認する方法は複数あります。本記事では、その中でも基本的な以下の4つの方法について解説します。これらの手法を活用することで、ボトルネックを特定し、パフォーマンスを改善することができます。
1. ログの確認
2. パフォーマンスツールの利用
3. クエリ実行計画の確認
4. ベンチマークの取得
1. ログの確認
Railsのログには、各リクエストの処理時間が記録されています。ログを確認することで、遅いリクエストを特定できます。
上記の例では、UsersController#indexアクションの処理に60msかかっています。内訳を見ると、Viewのレンダリングに53.8ms、ActiveRecordの処理に1.0msを要しています。
次に、あえてN+1問題を発生させた場合のログを見てみます。
処理時間が449msと遅くなっていることが確認できます。内訳を見ると、Viewのレンダリングに371.6ms、ActiveRecordの処理に65.8msを要しています。
ログを確認し、処理時間が長いリクエストを見つけたら、次のステップとしてその原因を追及することができます。
2. パフォーマンスツールの利用
Railsには、パフォーマンスを確認するためのツールがいくつか用意されています。代表的なものとして、rack-mini-profilerとbulletがあります。
rack-mini-profiler
rack-mini-profilerは、各リクエストのパフォーマンス情報を詳細に確認できるGemです。導入すると、ページの左上に、リクエストを送ってからページが表示されるまでの時間が表示されます。そこをクリックすることで、リクエスト処理の内訳をブラウザ上で確認することができます。これにより、ボトルネックの特定が容易になります。
N+1問題なしの場合
N+1問題ありの場合
N+1問題が発生している場合は、無駄なクエリが発行されていることが確認できます。青字のsqlのリンクをクリックすると発行されたクエリの詳細を確認することができます。
bullet
bulletは、N+1問題や冗長なクエリを検出するためのGemです。
bulletを導入すると、問題があるクエリ箇所で以下のような警告がログやブラウザ上のアラートで出力されます。
ログ
アラート
このように、無駄なクエリが検出されるので、その部分の最適化に取り組めます。
上記例の場合は、User.allをUser.includes(:posts)と修正することでN+1問題を解決することができました。
3. クエリ実行計画の確認
explainを使用することでクエリの実行計画を確認することができます。
例えば、実行計画を確認することで、インデックスが適切に利用されているかどうかを判断できます。インデックスが効率的に使われていないと、パフォーマンスが大幅に低下する可能性があります。
実行計画の確認は、Railsのコンソールから以下のようにして行えます。
Post.where(user_id: 12).explain
インデックスなしの場合
インデックスありの場合
インデックスありの場合は、keyに実際に使用するインデックスが記載されていることが確認できます。
その他、出力結果の詳細な解釈については以下の情報を参考にしてください。
・SQLite3: EXPLAIN QUERY PLAN
・MySQL: EXPLAIN 出力フォーマット (v8.0日本語)
・MariaDB: EXPLAIN
・PostgreSQL: EXPLAINの利用
4. ベンチマークの取得
Rubyのbenchmarkライブラリを使用してベンチマークを取得することができます。
例えば、コントローラーのindexアクションに以下の記載をします。
ログを検索すると、結果が出力されています。
N+1問題が発生していると処理に時間がかかることが確認できます。
まとめ
本記事では、Railsアプリケーションのパフォーマンスを確認する4つの方法について解説しました。
1. ログの確認
2. パフォーマンスツールの利用
3. クエリ実行計画の確認
4. ベンチマークの取得
これらの手法を適切に組み合わせることで、アプリケーションのボトルネックを発見し、パフォーマンス改善につなげることができます。
パフォーマンスの最適化は、アプリケーションの応答速度を向上させるだけでなく、サーバーリソースの無駄な消費を抑えるメリットもあります。開発の初期段階からパフォーマンスを意識し、定期的にチェックを行うことが重要です。
本記事で紹介した方法を活用しながら、継続的にパフォーマンスの改善に取り組んでいきましょう。
Vareal株式会社では、システムコンサルティング・UI/UXデザイン・ソフトウェア開発・AI開発/データ基盤構築、開発後の運用保守までワンストップでご支援可能ですので、なにかお役立ちできることがございましたら下記リンクよりお問い合わせくださいませ。
わたしたちと一緒に働いていただける方を大募集しています!
興味のある方はぜひ下記リンクをチェックしてみてください!
X(旧Twitter)では社内の雰囲気を発信しています、ぜひフォローしてみてください!