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
にアクセスすると、コンソールに以下のようなプロファイリング結果が出る。
↑は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が便利