猿に文明を与えるな

個人的な勝手なまとめ。

ISUCON3本戦遊び (5)

2回欠席 + 前回書くほどのことなかったのでいきなり (5) に。

newrelicインストール

遊んでみようと

過去の作業を思い出す

f:id:gorogoro13:20150705223609p:plain

上記のような悲惨な状態なので、画像取得部分を見ないとお話にならないという認識だったことを思い出した。

その辺りの対応を開始。

キャッシュ追加

ちょっと雑だけど、入れられそうなところに使ってみる。

$ 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 少し上がったかというところ

調査

サーバリソースがどこもサチってないので、各リクエストの処理時間を再確認

f:id:gorogoro13:20150705233933p:plain

GET /image/ の比率が減り、GET /icon/ の比率が高まっている。 次回はこれを調べていく。

nginxとunicornの通信をソケットベースにすることも考えたけど、サーバを分けることは十分あり得るので現時点の非ソケットベース設定のまま保留。


newrelicがひじょうに便利であることを認識