tkuchikiの日記

Linux やプログラミングについて書きます。

ISUCON4 予選1日目で惨敗しました

チーム 流れ弾 で ISUCON4 予選1日目に参加しました。

最終スコアは、29500 くらいでした。
言語は Ruby です。

残念な結果でしたが非常に有意義な時間を過ごすことが出来ました。
主催の LINE株式会社様、
協賛のクックパッド株式会社様、株式会社データホテル様、Amazon Web Services, Inc. 様、
ありがとうございました。

事前準備

  • 社内 IRC 用 nopaste ラッパースクリプト作成
  • RPM 作成
    • ngx_openresty-1.7.2.1
    • Monit-5.8.1
    • Redis-2.8.14
    • the_silver_searcher-0.24.1
  • VPC 作成
    • 起動時にログインできず未使用
  • Security Group作成
  • monit によるアプリ永続化の検証・設定ファイル作成
    • Unicorn
    • Resque 2.0
      • Resque 用 Redis の redis.conf & initscript 作成
  • Nginx の設定ファイル作成
  • MySQL 5.6 の設定ファイル作成
    • 5.5 インストール済みでしたので未使用
  • Unicorn, Resque の stop, start, restart スクリプト作成
  • Capistrano3 の検証・準備
    • local のファイルを deploy
  • セットアップスクリプト作成
  • github の private repository 作成

当日

開始前

  • Monster ポカリ作成
  • ディスプレイセッティング
  • 当日用マニュアル熟読
  • benchmarker のラッパースクリプト作成

競技中

10時
  • EC2 Instance 起動
    • VPC で立てたら ssh で入れなくて、EC2-Classic で起動
  • セットアップスクリプト実行
  • ベンチ実行
    • tag:benchmarker type:score success:6030 fail:0 score:1303
  • アクセスログ集計
# 左からアクセス回数、response time の min, max, avg, URI

1208   0.002    0.014     0.004     /images/isucon-bank.png
1208   0.001    0.037     0.004     /stylesheets/bootstrap.min.css
1208   0.001    0.015     0.003     /stylesheets/bootflat.min.css
1208   0.000    0.009     0.002     /stylesheets/isucon-bank.css
1105   0.002    0.006     0.003     /
604    0.004    0.375     0.068     /login
104    0.003    0.098     0.083     /mypage
1      18.605   18.605   18.605     /report
  • ソースコードを repository に push
  • Capistrano でデプロイできるように設定
  • アプリを Monit で監視するように設定
  • Redis の設定
  • Resque の設定
11時
  • Nginx の reverse proxy 先を unicorn.sock に向ける
  • Nginx で static file を返すように修正
    • tag:benchmarker type:score success:7180 fail:0 score:1551
  • pt-query-digest で重そうな SQL を探す
12時
  • rack-lineprof で profiling (@hilotter)
  • workload 2 で bench 実行
    • tag:benchmarker type:score success:12390 fail:0 score:2677
  • INDEX はる
    • tag:benchmarker type:score success:65110 fail:0 score:14064 (workload 1)
  • workload あげたら fail するようになる
13時から14時
  • Session に Redis を使ったら fail しなくなる
  • ローカルポートが枯渇していたことに気が付き対応
  • tag:benchmarker type:score success:109820 fail:0 score:23723 (workload ?)
15時
16時
  • Unix Domain Socket を使っていると、Fail することが分かったので listen port に変更した(Unicorn)
  • Redis のデータを毎回消さないとダメだとわかったので、init.sh に redis-cli FLUSHALL を仕込む
  • スコア伸びず
  • nginx lua module を試す
17時
  • nginx lua module の導入が間に合わないと判断して、細かい調整を行う
  • 競技終了
18時
  • Reboot しても動くようにしていたので、すぐに AMI を作成して提出

感想

  • 事前準備をしっかりしていたので、負荷を計測して INDEX を貼るまではそれなりに早く対応できた
    • しかし、それ以降は、あまりスコアを伸ばすことができなかった
      • 他のチームの方々とのスキルの差が如実に現れた
  • ぶっつけ本番で、がっつり nginx lua module を使うのは無理があった
    • 確実にできることをしたほうが良い
  • ローカルポートの枯渇に気がつくのに時間がかかったのが致命的だった
  • Unix Domain Socket...
  • ローカルのファイルを Deploy する Capistrano の sample 作りました (https://github.com/tkuchiki/capistrano3-local)