Rack applicationのプロファイリングにはrack-lineprofが便利

RubyKaigi 2014行った。良い発表がいろいろ聞けたんだけど、最近ISUCONに向けてwebアプリのチューニングに興味があったので特にfinal keynoteが興味深かった。
その中で紹介されていたtmm1/rblineprofが行ごとの実行時間を表示してくれるのでとても便利そうだったんだけど、GitHubではpeek/peek-rblineprofというRails用のプラグインでrblineprofを活用しているので、ISUCONでおそらく使用されるであろうsinatraでどうやって使うか考えていた。

kainosnoema/rack-lineprofというgemがその用途に便利そうだったので紹介したい。

使い方

rack-lineprofはRack middlewareで、まず以下のようにuseする必要がある。

require 'rack-lineprof'

class MyApp < Sinatra::Base
  use Rack::Lineprof
end

プロファイルする対象はクエリパラメータlineprofで指定する。

例えば、sinatraアプリをapp.rbで保存している場合、http://localhost:4567/?lineprof=app.rbにアクセスすると、コンソールに以下のようなプロファイリング結果が出る。

rack-lineprof

↑はISUCON3予選の初期状態なんだけど、どこがボトルネックになっているかが一発でわかって便利。

profile オプション

クエリパラメータに毎度プロファイリング対象を書くのは結構めんどくさいので、profileというオプションを作った。
Add profile option to specify profile target by k0kubun · Pull Request #1 · kainosnoema/rack-lineprof

これにより、以下のようにrack middlewareをuseするときのオプションでプロファイリング対象を指定することができる。

require 'rack-lineprof'

class MyApp < Sinatra::Base
  use Rack::Lineprof, profile: 'app.rb'
end

プロファイリング対象のファイルが固定の場合はこれを使うと便利。

まだgem pushされてないので、Gemfileは以下のようにする必要がある。

gem 'rack-lineprof', github: 'kainosnoema/rack-lineprof'

まとめ

Sinatraアプリのプロファイリングにはrack-lineprofが便利