rack-lineprofilerが便利と聞いたのでsinatra appで動かしてみる

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

rack-lineprofilerというprofilerが便利と聞いたので試してみたときのメモです。
rack-lineprofiler
https://github.com/kainosnoema/rack-lineprof

準備

最終的なファイル構成はこんな感じです

$tree
.
├── Gemfile
├── Gemfile.lock
├── app.rb
├── config.ru
└── unicorn.rb

0 directories, 5 files

準備としてやることはGemfileへのrack-lineprofの追加とapplication側でuseしてあげることです。

$cat Gemfile
source "https://rubygems.org"

gem 'rack-lineprof'
gem 'sinatra'
gem 'unicorn'

アプリケーション

適当なアプリケーションを書いて、unicorn上で起動しました。
sleepが入っているので / にアクセスすると2秒くらいレスポンスにかかります。

unicorn.rb

listen 8081
logger Logger.new($stdout)

config.ru

require "./app.rb"

run App

app.rb

require "sinatra"
require "json"
require "rack-lineprof"

class App < Sinatra::Base
    # ここでRack::Lineprofをuseしてあげます。
    use Rack::Lineprof, profile: './app.rb'
    @@data = {}
    get '/' do
        hoge(2)
        content_type :json
        @@data.to_json
    end

    post '/' do
        d = params[:x]
        @@data[d] = true
        content_type :json
        res = {
            result: "ok"
        }
        res.to_json
    end

    def hoge(x)
        sleep(x)
    end
end

プロファイラを見る

普通にapplicationを実行してあげます。
対象のURLにアクセスすると標準出力にどこの処理にどれくらいかかっているのかが出てきます。

$bundle exec unicorn -c ./unicorn.rb
I, [2016-09-22T22:32:12.557397 #68258]  INFO -- : listening on addr=0.0.0.0:8081 fd=9
I, [2016-09-22T22:32:12.557504 #68258]  INFO -- : worker=0 spawning...
I, [2016-09-22T22:32:12.558651 #68258]  INFO -- : master process ready
I, [2016-09-22T22:32:12.560334 #68259]  INFO -- : worker=0 spawned pid=68259
I, [2016-09-22T22:32:12.560864 #68259]  INFO -- : Refreshing Gem list
I, [2016-09-22T22:32:12.634865 #68259]  INFO -- : worker=0 ready

[Rack::Lineprof] ===============================================================

app.rb
               |   7      @@data = {}
               |   8      get '/' do
 2000.6ms     1 |   9          hoge(2)
   3.3ms     1 |  10          content_type :json
               |  11          @@data.to_json
               |  12      end
              .......
               |  23
               |  24      def hoge(x)
 2000.6ms     1 |  25          sleep(x)
               |  26      end
               |  27  end

127.0.0.1 - - [22/Sep/2016:22:32:17 +0900] "GET / HTTP/1.1" 200 2 2.0149

rack lineprofiler便利そうですね。

参考