ISUCON9の予選が近づいてきましたね。
私自身、昨年のISUCON8にはGo言語で出場したのですが、今年はチームメンバーの都合上Rubyで出場することになりそうです。
ISUCONではきちんとプロファイリングして根拠のあるチューニングを行うようにしているのですが、Rubyでは何を使ってプロファイリングすべきかわからなかったので調べてみました。
(ちなみに、Go言語だとpprofを使っていればそれなりに解析ができていました)
結果、stackprofが使えそうということがわかりました。
加えて、stackprof-webnavを併用することでWebブラウザから解析結果を閲覧できるようになることもわかりました。
これはISUCONにおいてチームメンバーとプロファイリング結果を共有する際に便利です。
例題として Y!SUCON のソースコードを使わせていただきました。
いつもありがとうございます。
インストール
Gemを追加する。
gem 'stackprof'
gem 'stackprof-webnav'
$ bundle install
stackprofをmiddlewareとしてrackに組み込む。
require 'digest/sha1'
require 'json'
require 'net/http'
require 'sinatra/base'
require 'sinatra/json'
require 'mysql2-cs-bind'
# ここから追記
require 'stackprof'
# ここまで追記
module Isuwitter
class WebApp < Sinatra::Base
# ここから追記
use StackProf::Middleware, enabled: true,
mode: :cpu,
interval: 1000,
save_every: 5
# ここまで追記
use Rack::Session::Cookie, key: 'isu_session', secret: 'kioicho'
set :public_folder, File.expand_path('../../public', __FILE__)
// 中略
end
end
stackprofのdumpファイルを格納するためtmpディレクトリを作成しておきます。
$ mkdir /var/www/webapp/ruby/tmp
$ chmod 777 /var/www/webapp/ruby/tmp # 他ユーザによる書き込みを許可
プロファイリングする
上記のようにコードを仕込んだあと、アプリを再起動します。
Y!SUCONの場合はsystemdで再起動できるようになっています。
$ sudo systemctl restart isucon-ruby-isuwitter
この状態でベンチマークを実行します。(もしくは調査したいページを開きます)
これにてプロファイリングは完了です。
ブラウザ経由でレポートを閲覧する
stackprof-webnavを実行することで、ブラウザ経由でレポートを閲覧できます。
$ stackprof-webnav -f tmp/stackprof-cpu-*.dump
ただし、これだと localhost:9292
でしかlistenしていないので、別ホストからページを開くことができません。
このため、nginxでリバースプロキシするよう設定します。
user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root /var/www/webapp/public;
location / {
proxy_set_header Host $host;
proxy_pass http://localhost:8080;
}
}
# ここから追記
server {
listen 19292;
root /var/www/webapp/public;
location / {
proxy_set_header Host $host;
proxy_pass http://localhost:9292;
}
}
# ここまで追記
}
confを修正したらnginxを再起動するのを忘れずに。
$ sudo systemctl restart nginx
$ stackprof-webnav -f tmp/stackprof-cpu-*.dump
ブラウザを開き、http:(サーバのIPアドレス):19292/overview
にアクセスするとstackprofの結果を閲覧できます。