peek-rblineprofでRailsアプリの計測結果を画面で確認する

Ruby

前回、【Ruby】rblineprofで行単位の計測を行う方法rblineprofを利用したRubyのプロファイリング方法について紹介しました。

rblineprofを利用すると、計測対象のファイルに計測用のコードを埋め込むことで行単位のプロファイリング結果がコンソールで確認できます。

rblineprofと似たgemでpeek-rblineprofというものがあります。
peek-rblineprofを利用すると、rblineprofの計測結果が画面上で確認できます。
またpeek-rblineprofrblineprofと違い、計測用のコードを埋め込む必要がありません。

今回はpeek-rblineprofを利用したRailsアプリケーションの計測方法について紹介します。
railsは6.0.3.6を利用します。

下準備: サンプルアプリケーションの作成

今回は例として、N+1問題が発生しているビューの計測をします。
具体的には『生徒一覧画面で生徒名と所属学部を表示する』という画面でN+1問題を発生させます。

rails sでアプリケーションの起動ができている前提で説明をします。

scaffoldでアプリのひな型を作成

scaffoldでStudentモデル(生徒)とDepartmentモデル(学部)に関するコードを一括作成します。

### scaffoldで関連コードを一括作成
$ rails g scaffold department name
$ rails g scaffold student name department:references

### マイグレーションの実行
$ rails db:migrate

N+1問題が発生する画面の作成

生徒一覧画面を作成します。
student.department.nameがN+1問題の発生する箇所です。

app/views/students/index.html.erb

<h1>生徒一覧</h1>

<table>
  <thead>
  <tr>
    <th>生徒名</th>
    <th>学部</th>
  </tr>
  </thead>

  <tbody>
  <% @students.each do |student| %>
    <tr>
      <td><%= student.name %></td>
      <td><%= student.department.name %></td>
    </tr>
  <% end %>
  </tbody>
</table>

サンプルデータの作成

seedコマンドを利用してサンプルデータを作成します。

db/seeds.rb

Department.create(name:'経済学部')
Department.create(name:'外国語学部')
Department.create(name:'社会学部')
Department.create(name:'理工学部')

Student.create(name:'鈴木', department_id:1)
Student.create(name:'田中', department_id:2)
Student.create(name:'山田', department_id:3)
Student.create(name:'伊藤', department_id:4)
### seedデータをテーブルにインサート
$ rails db:seed

### seedデータのインサートをやり直したい場合
$ rails db:migrate:reset
$ rails db:seed

画面の確認

localhost:3000/studentsにアクセスして以下のような生徒一覧の画面が表示されればOKです。

peek-rblineprofの導入手順

ここからはpeek-rblineprofの導入手順について紹介します。

peek-rblineprofのインストール

Gemfileを修正し、peek-rblineprofをインストールします。

Gemfile

group :development do
  gem 'peek-rblineprof'
end
$ bundle

イニシャライザを追加する

イニシャライザに関するファイルを作成します。

config/initializers/peek.rb

Peek.into Peek::Views::Rblineprof

JSファイルとCSSファイルを修正する

peek-rblineprofは計測結果を画面上に表示します。
そのためJSファイルとCSSファイルの修正が必要です。

以下のように修正します。

app/javascript/packs/application.js

require ("peek")
require ("peek/views/rblienprof")

assets/stylesheets/application.css

/*
*= require peek
*= require peek/views/rblineprof
*/

シンタックスハイライトを有効にする(任意)

peek-rblineprofはデフォルトではコードのシンタックスハイライトが有効になっていません。
シンタックスハイライトを有効にする場合は以下の追加修正をします。

Gemfile

group :development do
  gem 'peek-rblineprof'
+ gem 'pygments.rb', require: false
end

assets/stylesheets/application.css

  /*
  *= require peek
  *= require peek/views/rblineprof
+ *= require peek/views/rblineprof/pygments
  */

peek-rblineprofで計測する方法

エンドポイントに?lineprof=[計測の範囲]&lineprofiler_mode=[モード]というクエリパラメータを追加してアクセスをすると計測結果が確認できます。

各クエリパラメータのオプションは以下の通りです。

lineprofilerのオプション
  • app: 『Rails.root/(app|lib)』配下のコード
  • views: 『Rails.root/app/views』配下のコード
  • gems: 『Rails.root/vendor/gems』配下のコード
  • all: 『Rails.root』配下のコード
  • stdlib
lineprofiler_modeのオプション
  • wall: 経過時間
  • cpu: CPU時間 + アイドル時間(経過時間 – CPU時間)

たとえば、生徒の一覧画面(http://localhost:3000/students)に関するビューのCPU時間を計測する場合はhttp://localhost:3000/students?lineprofiler=views&lineprofiler_mode=cpuとなります。

http://localhost:3000/students?lineprofiler=views&lineprofiler_mode=cpuにアクセスした結果は以下の通りです。

シンタックスハイライトを有効にした場合の結果は以下の通りです。

まとめ

peek-rblineprofの利用手順
  1. gemをインストール
  2. peek-rblineprofのイニシャライザを設定
  3. CSSファイルとJSファイルを修正
  4. (必要であれば)シンタックスハイライトの設定
  5. 『?lineprof=[計測の範囲]&lineprofiler_mode=[モード]』のクエリパラメータを追加してアクセス

RailsをはじめとしたRackアプリケーションであれば、rack-lineprofを利用した計測もオススメです。
rack-lineprofpeek-rblineprofに比べて導入がシンプルで、処理の遅い行はハイライトされます。

rack-lineprofを利用した計測手順についてはrack-lineprofを使ってRailsアプリを行単位でプロファイリングする手順で紹介していますのであわせてご覧になってください。

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考