これは何?
レスポンスタイムが遅くて辛いけど原因が特定できないときに役立つツールをまとめてみました
- Rails以外でも使えるものも一緒くたに書いているけど、気にしない!
やらないこと
それぞれのツール詳細な説明
- 気が向いたら個別記事を書く
環境
New Relic
パフォーマンス監視サービス
- 運用フェイズ
- アクション実行時にどの処理にどれだけ時間が掛かったかをメトリクス収集してくれる
参考
以降のツールは基本的には開発、テスト時に使用するやつです
rack-mini-profiler
パフォーマンス計測ツール(gem)
- アクション実行時に、ブラウザにレンダリングに掛かった処理の時間を表示してくれる
参考
bullet
N+1問題検出ツール(gem)
- アクション実行時に、N+1問題があるとポップアップやログで警告してくれる
出力例
2009-08-25 20:40:17[INFO] N+1 Query: PATH_INFO: /posts; model: Post => associations: [comments]· Add to your finder: :include => [:comments] 2009-08-25 20:40:17[INFO] N+1 Query: method call stack:· /Users/richard/Downloads/test/app/views/posts/index.html.erb:11:in `_run_erb_app47views47posts47index46html46erb' /Users/richard/Downloads/test/app/views/posts/index.html.erb:8:in `each' /Users/richard/Downloads/test/app/views/posts/index.html.erb:8:in `_run_erb_app47views47posts47index46html46erb' /Users/richard/Downloads/test/app/controllers/posts_controller.rb:7:in `index'
参考
activerecord-cause
クエリの実行箇所をログに出力してくれるツール(gem)
bulletで分からないような、ビューのループの中で直接モデル読んでるみたいなヤバイ箇所を速やかに見つけるためのものです。
出力例
D, [2015-04-15T22:13:46.928908 #66812] DEBUG -- : User Load (0.1ms) SELECT "users".* FROM "users" D, [2015-04-15T22:13:46.929038 #66812] DEBUG -- : User Load (ActiveRecord::Cause) caused by /Users/joker/srcs/activerecord-cause/spec/activerecord/cause_spec.rb:16:in `block (3 levels) in <top (required)>'
参考
stackprof & stackprof-webnav
a sampling call-stack profiler for ruby 2.1+
(gem)
出力例
参考
rack-lineprof
- 行単位に処理に掛かった時間を表示してれる
- 重い処理はハイライトしてくれる。便利!
- stackprof は、処理時間の収集。rack-lineprof は特定の処理について見たい時に、みたいな使い分け?
- stackprofで十分かもしれない
出力例
参考
rails_best_practices
静的解析ツール(gem)
- Rails Best Practicesに沿わないコードを指摘してくれるツール
- CIと組み合わせるべき
Always add DB index
とかが発見されるとパフォーマンスに直結するはず
参考
module Benchmark
- 怪しいと思った部分を
Benchmark.benchmark
で囲むと、ベンチマークが取れる - 修正前/後でどれだけ処理が軽くなったか確認する時などに
参考
その他
rails-perftest
- Rails4で本家から分離されたgem
- パフォーマンス計測ツールらしいけど、記事が殆ど無い...?
SQL auto explain (Rails4で削除済)
Rails同梱の、処理が遅いSQLを自動的に通知してくれるツールだったけど、Rails4で削除された
ActiveRecord::Relation#explain
は残っているらしいので、個別に怪しい処理をirbからexplainするのがよいかもしれない
考えていること
rack-mini-profiler
やbullet
はアクションを実行した時に遅い部分を見つけるツール- テスト実行時に、一緒にパフォーマンス計測をして、遅い処理を見つける方法ってないものだろうか?
- フィーチャーテスト実行時に、一緒にパフォーマンス計測とか???
- ボトルネックを見つけたら、その部分についてはパフォーマンステストも実行する。とかが現実的なのだろうか?
TODO
- ボトルネックを見つけた後の対処方法をまとめる
参考
ツール紹介
- パフォーマンス・チューニングやオススメGem in 「Rails勉強会@東京 第88回」 - 酒と泪とRubyとRailsと
- Railsアプリのパフォーマンスチューニング用ツール紹介 - Qiita
- Ruby プロセスを追いかけるツール(プロファイラとか)10選 - sonots:blog
- Railsパフォーマンス基本のキ // Speaker Deck
パフォーマンスチューニングの実践
- 【Rails 高速化】ペパボのフリマアプリ「kiteco(キテコ)」の API を高速化したときのことを詳しく書いてみた - 彼女からは、おいちゃんと呼ばれています
- Railsアプリを『浅く』パフォーマンス・チューニングしてみる(その1) | Oh My Enter!
- Railsアプリケーションのデータベースチューニングについて - Qiita
- 1年間で取り組んだProttのパフォーマンスチューニング - console.blog(self);
- サービスが遅いとハートを揺さぶれない
- カッコイイ!!
- Ruby - ActiveRecordを速くしたいだけの人生だった - Qiita
- railsアプリでstackprofを使ってボトルネックを探す + JSON::Schema(2.2.1)の高速化 - CubicLouve