ISUCON3本戦遊び (5)
2回欠席 + 前回書くほどのことなかったのでいきなり (5) に。
newrelicインストール
遊んでみようと
過去の作業を思い出す
上記のような悲惨な状態なので、画像取得部分を見ないとお話にならないという認識だったことを思い出した。
その辺りの対応を開始。
キャッシュ追加
ちょっと雑だけど、入れられそうなところに使ってみる。
$ sudo yum install memcached $ view app.rb @@ -7,6 +8,10 @@ require 'tempfile' require 'fileutils' require 'uuid' +# add cache +require 'dalli' +$cache = Dalli::Client.new 'localhost:11211' @@ -306,13 +313,21 @@ class Isucon3Final < Sinatra::Base h = w if w - file = crop_square("#{dir}/image/#{image}.jpg", 'jpg') - data = convert(file, 'jpg', w, h) - File.unlink(file) + data = $cache.get("#{image}_jpg_#{w}_#{h}") + unless data + file = crop_square("#{dir}/image/#{image}.jpg", 'jpg') + data = convert(file, 'jpg', w, h) + File.unlink(file) + $cache.set "#{image}_jpg_#{w}_#{h}", data + end else - file = File.open("#{dir}/image/#{image}.jpg", 'r+b') - data = file.read - file.close + data = $cache.get("#{image}_jpg") + unless data + file = File.open("#{dir}/image/#{image}.jpg", 'r+b') + data = file.read + file.close + $cache.set "#{image}_jpg", data + end end
=> done benchmark: score 1082.52955410459, elapsed 62.609 sec = 17.290 / sec
やっと1000超えた...
worker_process
nginxとunicornの設定を変更
nginx.conf: 1 => auto # 自動でやってくれるならそれがよかろう
unicorn_config.rb: 10 => 50 # メモリにだいぶ余裕あったので
=> done benchmark: score 1794.02117331082, elapsed 60.869 sec = 29.474 / sec
少し上がったかというところ
調査
サーバリソースがどこもサチってないので、各リクエストの処理時間を再確認
GET /image/
の比率が減り、GET /icon/
の比率が高まっている。
次回はこれを調べていく。
nginxとunicornの通信をソケットベースにすることも考えたけど、サーバを分けることは十分あり得るので現時点の非ソケットベース設定のまま保留。
newrelicがひじょうに便利であることを認識