J-ogawa/isucon_dev

rack-lineprof導入

Opened this issue · 0 comments

ソースコードベースで処理時間が可視化できる。
基本的にコメントアウトしておいて、ローカルで見るときだけONにする
https://github.com/J-ogawa/isucon/commit/bd3d7220239c4eed693d59b58176e0b591f2519f

出力例

[Rack::Lineprof] ===============================================================
app.rb
               |  22
               |  23        def db
   5.4ms  8310 |  24          Thread.current[:isu4_db] ||= Mysql2::Client.new(
               |  25            host: ENV['ISU4_DB_HOST'] || 'localhost',
               |  26            port: ENV['ISU4_DB_PORT'] ? ENV['ISU4_DB_PORT'].to_i : nil,
              .......
               |  104          threshold = config[:ip_ban_threshold]
               |  105
 221.0ms     2 |  106          not_succeeded = db.xquery('SELECT ip FROM (SELECT ip, MAX(succeeded) as max_succeeded, COUNT(1) as cnt FROM login_log GROUP BY ip) AS t0 WHERE t0.max_succeeded = 0 AND t0.cnt >= ?', threshold)
               |  107
               |  108          ips.concat not_succeeded.each.map { |r| r['ip'] }
               |  109
  76.3ms     2 |  110          last_succeeds = db.xquery('SELECT ip, MAX(id) AS last_login_id FROM login_log WHERE succeeded = 1 GROUP by ip')
               |  111
  68.3ms     1 |  112          last_succeeds.each do |row|
  66.7ms  1020 |  113            count = db.xquery('SELECT COUNT(1) AS cnt FROM login_log WHERE ip = ? AND ? < id', row['ip'], row['last_login_id']).first['cnt']
               |  114            if threshold <= count
               |  115              ips << row['ip']
              .......
               |  124          threshold = config[:user_lock_threshold]
               |  125
  61.7ms     2 |  126          not_succeeded = db.xquery('SELECT user_id, login FROM (SELECT user_id, login, MAX(succeeded) as max_succeeded, COUNT(1) as cnt FROM login_log GROUP BY user_id) AS t0 WHERE t0.user_id IS NOT NULL AND t0.max_succeeded = 0 AND t0.cnt >= ?', threshold)
               |  127
   1.6ms     3 |  128          user_ids.concat not_succeeded.each.map { |r| r['login'] }
               |  129
  54.6ms     2 |  130          last_succeeds = db.xquery('SELECT user_id, login, MAX(id) AS last_login_id FROM login_log WHERE user_id IS NOT NULL AND succeeded = 1 GROUP BY user_id')
               |  131
 19978.9ms     1 |  132          last_succeeds.each do |row|
 19935.9ms 15584 |  133            count = db.xquery('SELECT COUNT(1) AS cnt FROM login_log WHERE user_id = ? AND ? < id', row['user_id'], row['last_login_id']).first['cnt']
               |  134            if threshold <= count
               |  135              user_ids << row['login']
              .......
               |  174        content_type :json
               |  175        {
 365.7ms     1 |  176          banned_ips: banned_ips,
 20096.7ms     1 |  177          locked_users: locked_users,
   3.8ms  2509 |  178        }.to_json
               |  179      end
               |  180    end
127.0.0.1 - - [15/Oct/2017 17:28:55] "GET /report HTTP/1.1" 200 31449 20.4711