ISUCON12予選に「Railsへの執着はもはや煩悩(ry」で参加して予選通過しました

今年も@cnosukeさんと@aibouさん一緒に、「Railsへの執着はもはや煩悩の域であり、開発者一同は瞑想したほうがいいと思います。」というチームでISUCONの予選に出ました。

最終スコアは28,080点で、予選通過することができました。

一次募集も二次募集も一瞬で枠が埋まってしまい申込みに間に合わなかったので、出題を担当した回を除いてISUCON3から毎年出ていたISUCON参加がついに途切れてしまうかと思ってしまいましたが、なんとか追加募集の枠で参加することができました。

(追加募集の枠も3分くらいで埋まってしまったので本当に危なかった。。。)

ISUCON10, ISUCON11も同じメンバーで、そのときは予選1週間前くらいに練習していたのですが、今年はタイミングが合わずぶっつけ本番になってしまいました。

なんとなくの分担

cnosukeさんが主にアプリ改修とか、aibouさんがSQLiteMySQLのデータ移行やMySQLのインデックス周りとか、自分はデプロイとか細々とした作業をやる感じで、分担していました。

3年目ということもあって割りとスムーズに進められた気がします。

なんとなくのスケジュール

3人がやったこと全部を雑に書いてます。

時刻 やったこと メモ
09:30 集合
10:00 競技開始
10:15 とりあえず初期状態でベンチ回す 2,800点くらいだった気がする
10:30 nginxとMySQLの設定ファイル群と、webappを、まるっとgitリポジトリに突っ込んだりした /etc/mysqlシンボリックリンクを張るようにしていたがうまく動いてくれなくなったので後でMySQLについてはgit管理を諦めた
10:45 コード読んだりkataribeを導入したりしてた
10:55 1号機をnginx, webapp, SQLiteに、2号機をMySQLに、3号機は使わない構成にして、破壊的な実験とかは3号機で試してもらうような状態にした 特に大きく手を入れてなかったのでMySQLがめちゃくちゃCPUを食ってる状態になった
11:25 MySQLにインデックスを張ったりしていた
13:50 とにかく「GET /api/player/competition/:competition_id/ranking」が遅いことがわかったので対策を考え始める
15:10 SQLiteに入ってたデータを全部MySQLにダンプして、SQLiteは全く使わない状態にした 2,826点
15:55 採番ロジックが複雑そうに見えたのでULIDを使うように変更した 4,267点
16:30 1号機をMySQLに、2号機をwebappに、3号機をnginxという構成にした 7,469点
17:05 いろいろキャッシュを入れたり地道に修正 10,234点
17:15 SQLiteは捨てたのにflockしっぱなしだったのに気づいて修正 20,669点 1号機(MySQL)だけがとにかく重い状態になった
17:30 更にcompetition周りをキャッシュ化 22,037点
17:45 インデックスを更に張ったり再起動試験したりしてたら更に上がったので、もうこれ以降は提出をやめることに 28,080点
18:00 競技終了

最終的な構成図


ベンチが詰まることもなく、その他のトラブルもなくとても快適な競技環境でありがたかったです。

運営の皆様、本当にありがとうございました!!

ISUCON7以来、5年ぶり3回目の本戦出場なので楽しみにしてます!!!!