というわけで、昨日開催されたISUCON12予選にチーム"トドランド"で参加してきました。
5071点(最高スコア=最終スコア)で192位でした。
チーム
去年は元グループ内の仲良し独身男性たちとでしたが、今年はグループ内のパイセンたちとでした。 id:mazinlabs に「なおすけでるよね?」と言われて「出ますぅ」いう流れでした。もう一人は同じグループの人で興味ありの方がいたので混ざって3人チームとなりました。
使用言語は、
やったこと
10:00頃
- とりあえず id:mazinlabs がデプロイ
- デプロイ後にツールだったりいくつか設定を突っ込むスクリプトを実行
- 初期計測
なお、初期設定のスクリプトにバグがあったので途中でVMデプロイし直しなどしました…。
10:30頃〜
- マニュアルを音読
- チームでワイワイとコードリーディング
- alpの結果を見ながら、「ここやばそうな処理だねー」とか話してた
- ついでにMySQLとSQLite3という構成に気づいてメンバーみんなで「マジ?」みたいなこと話してた
11:00〜17:00
適当に分かれて修正開始。自分の貢献だけ書くとこんな感じ
- rankingにn+1がある香りがしたのでそれの解消(12:30頃)
SELECT *
の結果を for inで回してたのでJOINを使っておりゃーと書き換え (+300点くらい)
POST /api/organizer/competition/<competition_id>/score
とPOST /api/organizer/players/add
がバカみたいに重かったので解消(16:30頃)- N+1っぽい INSERTを叩きまくっていたので
DB.begin
をつかって一気に突っ込むよう修正 (+1500点くらい)
- N+1っぽい INSERTを叩きまくっていたので
他のメンバーは、 * Slow query logを見てIndexを貼ったり主にDB関連の対応 * SQLiteをどうにかMySQLに突っ込めるように対応(これは間に合わなかった)
17:00-18:00
再起動に向けていつものやつをやってました
- Debug logの停止
- 再起動実験
まあ、再起動したらベンチ失敗して「なんでや!」となったので、再起動実験の重要性を身を持って知ることができました*2
振り返り
バルクインサートにした割にflockを解消しきってなかったり、Worker数を上げてなかったりと微妙にやりきれてないのがあり詰めの甘さが露呈しましたね…。あと(本業でない言語とはいえ)問題解析から修正までがちょっと時間かかりすぎですね。もうちょい手を速くしたい。
チームとしては、SQLiteをもう少しどうにかするのにもっと手を割くべきだったかもしれません。解説にもありましたが、チームIDに応じてNginxで複数サーバに振り分けをするとかはありだったかとおもいます。もう少し柔軟な方針転換が必要だったかもしれませんな…。
あと、昨年とは違いいくつか初期設定のスクリプトを作ったのですが、これは結構いいですね。特に、ベンチを回す際にログをローテートするとかは(常連の人からすると当たり前な準備ですが)非常に便利でした。
感想
昨年とは参加メンバーも変わりましたが、順位的には昨年を上回ったのでひとまずヨシ! みたいな感じでいます。 8時間ぶっ通しでコードと格闘するの、最近はあまりなかったのでシンプルに楽しい時間を過ごせました。
問題も、解説を読むといろいろなポイントを活かしていろいろな解き方ができると書かれていて、結構実際のシステム検討でもあり得るテーマで非常に面白かったです。 しばらくは検討会をして遊ぼうと思います。
運営の皆さん、今年も素晴らしい問題をありがとうございました。