ISUCON12 に参加した
ISUCON12にチーム「喫茶ten」として参加して、7958点を取った。感想やら反省やらをつらつらと書いていく。
チームメンバー
ten986
(練習/本番の)環境構築と、初動の準備担当、練習の呼びかけ担当
その後はアプリ触ったりペアプロ担当したり
asRagi
主にアプリ担当
ISUCONチェックリストの作成をした。わりとなんでも知ってる
チームの指揮、方針決めなどもしていたと思う
kuromitz
主にインフラ担当
サーバーが分割できるのはこの人のおかげ、時折点数を跳ね上げる
本番までにやったこと
各自ISUCON本を読んだ
2週間前の日曜に集まろうとする
主にten986のみが参加する(?)
ここでten986がISUCON本とprivate-isuでISUCONの渡り歩き方を知る
1週間前の日、月に集まる
日:ISUCON10予選
asRagi, kuromitz は解いたことがあるため、細かい動きの確認が主
いい感じの点数が出た
月:ISUCON11本戦
アプリ側の改善方法がなければサーバーを分けること、ベンチマーカーの気持ちになることを覚えた
本番
9:40 くらい
放送開始
全員起きたのでえらい
10:00 くらい
開始
ten986 がサーバーの準備をしている間に asRagi, kuromitz がマニュアルを読む、ten986 は聞き流す
10:30 くらい: 3000点程度
この辺でベンチマークが回る。3000点程度
ten986 がサーバーの準備を続け、asragi, kuromitz が改善できそうなところを探る
11:00 くらい
pt-quert-digest を見ると、全然 slow query が載ってないことに気づく
よく見ると、sqlite が使われている。は〜?
ところで alp を見る限りは「GET /api/player/competition/:competition_id/ranking」と「GET /api/player/player/:player_id」が重そうなので、asRagi と ten986 がそれぞれを見る
ところで主に asRagi が sqlite を MySQL にマイグレーションする方法を調べ始める
12:30 くらい: 3500点程度
kuromitz がDBサーバーの分割に成功して、3000点 -> 3500点 に
えらいぞ
13:00〜14:00 くらい
sqlite に苦戦
100個の.dbファイルがある中、1.dbだけ160万レコードある罠により、2.db〜100.dbもその程度の容量か?と考えたが、なんと2.db〜100.db合わせて1.dbくらいの容量だったりする
1.db をそのまま MySQL に流すと異様に時間がかかったため、途中でやめる。まあ160万レコードあるしなあ
ちなみに、1.db だけ MySQL に移行できたため、explain だけ MySQL で行い、index は sqlite の方で貼ることができた。1番のおもしろ状態だった
14:30〜15:00 くらい
このへんで「GET /api/player/player/:player_id」を見ていた ten986 が、各 (competition_id, player_id) の組で最大の row_num を持つものしか必要ないことを発見する
ten986 と asRagi が対応し、*.db の各ファイルで delete をかけることで、容量の圧縮に成功する
しかし、/initialize で *.db を MySQL に流そうとすると1分程度になり、30秒の制限を超えてしまい、このへんで MySQL への移行を断念する
(これは感想戦で分かったことだが、https://pypi.org/project/sqlite3-to-mysql/ を使っていただけなのが原因で、圧縮した上で dump を取れば普通に間に合うらしい、う〜んw)
/initialize が間に合わないものの、MySQL に移した状態のベンチマーク自体は取れていた。500点。500点!?!?!?!?!?!?!?
これも MySQL 移行を断念する要素となった
この辺までずっとsqliteに苦労していたので、実質ここからISUCONスタート。半ISUCONですね、うん
sqlite の駆逐に失敗したため、slow query の取得ができず、alp からエスパーコンテストを以降することになる
16:45 くらい: 8000点程度
ten986 が row_num 周りの変更に成功。この時点では点数は上がらなかったが、排他ロックをかける必要がないと判断し、削除。これで 3500 -> 8000
なお、排他ロックを適当に外したせいで、3回に1回ベンチマークが落ちるようになりました。草
1番伸びのいい変更だったこともあり、割り切ることにした
〜18:00
ten986 が「POST /api/organizer/competition/:competition_id/score」の改善、asRagi が「GET /api/admin/tenants/billing」の改善、kuromitz がアプリサーバーの分割や数値の調整をするも、間に合わなかったり、劇的な改善には至らなかったりする
7958点でフィニッシュ
最後駆け込みでいくつかサーバーをいじったり、ベンチマーカーがたまに落ちたりしていたが、失格にはならなかったためめでたい
感想
ISUCON本がありがたかった
private_isu をもとに実践形式で学べるのがいいですね
去年よりやれることが格段に多くなったため、本戦やってて楽しかった
というか去年は練習環境構築に苦戦する以外のことやってなかった気がする(?)
適当にチームを組んだものの、かなりバランスの取れたチームになった
たまたまサークルで余った3人だったはず
sqlite を移行するかどうかの判断が遅かったのが反省点か
噂によれば、予選突破者でも sqlite と共存しつつ動いていたチームが結構いるらしい