【Rails】rack-mini-profilerの導入・計測方法まとめ

Ruby

Railsアプリの計測用gemで有名なrack-mini-profilerのインストール方法および利用方法について紹介します。

rack-mini-profilerで計測できること

rack-mini-profilerは、画面が表示されるまでに実行されたメソッドとその処理時間を計測します。
具体的には以下の計測ができます。

  • レスポンスの時間
  • レンダリング(view)の時間
  • アクション(controller)の時間
  • SQLの実行回数
  • SQLの実行時間

rack-mini-profilerのインストール手順

rack-mini-profilerのインストール手順について紹介します。

gemの追加

gemをインストールします。

Gemfile

group :development do
  gem 'rack-mini-profiler'
end
$ bundle

参考: rack_mini_profilerの起動方法をカスタマイズしたい場合

イニシャライザファイルを作成することでrack_mini_profilerの起動方法をカスタマイズできます。1
たとえばrack-mini-profilerをGemfileに入れるときは require: false しようでは、rack-mini-profilerの設定有無を判定する環境変数を用意し、『有効なら起動、無効なら起動しない』という制御をイニシャライザファイルで行っています。

イニシャライザファイルを利用する場合のrack_mini_profilerのインストール方法は以下の通りです。

Gemfile

### require: falseを設定する
group :development do
  gem 'rack-mini-profiler', require: false
end
### rack-mini-profiler をインストール
$ bundle

### config/initializers/rack_profiler.rb の作成
$ rails g rack_profiler:install

Running via Spring preloader in process 380
      create  config/initializers/rack_profiler.rb

rails g rack_profiler:install実行後、以下のファイルが自動で作成されます。

config/initializers/rack_profiler.rb

# frozen_string_literal: true

if Rails.env.development?
  require "rack-mini-profiler"

  # initialization is skipped so trigger it
  Rack::MiniProfilerRails.initialize!(Rails.application)
end

(任意) rack-mini-profilerの機能拡張をする

gemを追加することでrack-mini-profilerの機能を拡張できます。

メモリの計測をしたい場合はmemory_profiler、計測結果をグラフ表示したい場合はstackprofflamegraphをインストールします。

Gemfile

group :development do
  gem 'rack-mini-profiler'

  # For memory profiling
  gem 'memory_profiler'

  # For call-stack profiling flamegraphs
  gem 'stackprof'
  gem 'flamegraph'
end

$ bundle

rack-mini-profilerの利用方法

rack-mini-profilerをインストール後、任意の画面にアクセスすると画面左上に計測時間が表示されます。
計測結果の表示・非表示はoption + pで行えます。

計測時間をクリックすると詳細情報が確認できます。
詳細画面では、『リクエスト時間』『レンダリング(view)の時間』『アクション(controller)の時間』の確認ができます。また、各ロジックで実行されているSQLの詳細も確認できます。

flamegraphstackprofをインストール後、?pp=flamegraphのクエリパラメータを追加すると計測結果をグラフで確認できます。
たとえばlocalhost:3000/studentsの計測結果をグラフ表示したい場合はlocalhost:3000/students?pp=flamegraphとなります。結果は以下の通りです。

memory_profilerをインストール後、?pp=profile-memoryのクエリパラメータを追加するとメモリのプロファイリング結果を確認できます。結果は以下の通りです。

rack-mini-profilerで利用できるクエリパラメータ

rack-mini-profilerには先ほど紹介した?pp=flamegraph?pp=profile-memory以外にもクエリパラメータのオプションが用意されています。主なクエリは以下の通りです。

クエリ 内容
pp=help ヘルプページの表示
pp=flamegraph 計測結果をグラフ表示
pp=profile-memory メモリの計測結果を表示
pp=disable 計測の無効化
pp=enable 計測の有効化

オプションの一覧は[アプリの任意のURL]?pp=helpで確認できます。

pp=helpによるヘルプページ

まとめ

rack-mini-profilerを利用することで『画面が表示されるまでにどのようなアクション・SQL・レンダリングが実行されているか、そしてその実行時間はどれくらいなのか』ということがわかります。
ですので、チューニング対象の当たりをつける際にrack-mini-profilerは有効です。

チューニング対象の当たりがついており、行単位の詳細な計測がしたい場合はrack-rblineprofがオススメです。
rack-lineprofを利用した計測手順についてはrack-lineprofを使ってRailsアプリを行単位でプロファイリングする手順で紹介していますのであわせてご覧になってください。

参考