kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

Rails高速化のためのパフォーマンスチューニングに役立つツール 8個+α

これは何?

レスポンスタイムが遅くて辛いけど原因が特定できないときに役立つツールをまとめてみました

  • 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)

  • メソッドの実行時間をメトリクス収集
  • stackprof-webnavで、収集結果をリストアップして見やすくしてくれる
  • 処理が早いので、運用フェイズで使用しても殆どボトルネックにならないらしい

出力例

参考

rack-lineprof

行単位のベンチマークツール(gem)

  • 行単位に処理に掛かった時間を表示してれる
  • 重い処理はハイライトしてくれる。便利!
  • stackprof は、処理時間の収集。rack-lineprof は特定の処理について見たい時に、みたいな使い分け?
    • stackprofで十分かもしれない

出力例

参考

rails_best_practices

静的解析ツール(gem)

  • Rails Best Practicesに沿わないコードを指摘してくれるツール
  • CIと組み合わせるべき
  • Always add DB index とかが発見されるとパフォーマンスに直結するはず

参考

module Benchmark

ベンチマークモジュール(Ruby標準)

  • 怪しいと思った部分を Benchmark.benchmark で囲むと、ベンチマークが取れる
  • 修正前/後でどれだけ処理が軽くなったか確認する時などに

参考

その他

rails-perftest

  • Rails4で本家から分離されたgem
  • パフォーマンス計測ツールらしいけど、記事が殆ど無い...?

SQL auto explain (Rails4で削除済)

Rails同梱の、処理が遅いSQLを自動的に通知してくれるツールだったけど、Rails4で削除された

ActiveRecord::Relation#explain は残っているらしいので、個別に怪しい処理をirbからexplainするのがよいかもしれない

考えていること

  • rack-mini-profilerbullet はアクションを実行した時に遅い部分を見つけるツール
  • テスト実行時に、一緒にパフォーマンス計測をして、遅い処理を見つける方法ってないものだろうか?
  • フィーチャーテスト実行時に、一緒にパフォーマンス計測とか???
  • ボトルネックを見つけたら、その部分についてはパフォーマンステストも実行する。とかが現実的なのだろうか?

TODO

参考

ツール紹介

パフォーマンスチューニングの実践