isucon3 の予選に参加しました #isucon

オンライン予選 二日目の結果 & 暫定版の本選出場チーム発表 : ISUCON公式Blog

運営の皆様ありがとうございました。

@kenjiskywalker さん , @hisaichi5518 と参加しました。 結果的には暫定的に2日合わせて 20 位以内に入れたというところでしょうか。メモ代わりに何をやったかとか。

開始前

案の定 hisaichi5518 から反応がなく遅刻確定。kenjiskywalker さんは腹痛をしてました。

開始直後

kenjiskywalker さんに aws 回りはお願いし、出来上がった所でとりあえず関係ありそうな所を git 化し push, clone 出来るようにしました。 共有レポジトリを 0 から作るのは毎回どこかでハマるのでそろそろどうにかしたいなーと思う所。

レギュレーションを読み、フムンとなりながら、スコアを出す負荷ツールの workload を、予選作る時のテストの為に並列度をあげるものなんじゃない?と二人で勘違い。勘違いしていたことに気づいたのは予選が終わってからでした。

git 化、レギュレーションをだいたい読み終わった辺りで hisaichi5518 が到着。

一瞬 mysql を辞める話も出ましたが、まぁ、 mysql で問題が出るような出題はしないだろうという結論になり mysql でいくことにしました。

お昼ぐらいまで

まずは bench.sh だけですぐに実行出来るようにしました。 その後、とりあえずインフラ回りは kenjiskywalker さんにお願いし hisaichi5518 とコード読んであれこれ言って、ぱっと見ても問題そうな markdown 回りと簡単な index と order by created_at desc, id desc の created_at はいらなさそうなので消す作業を二人でしました。

あとアプリサーバは、starlet + http::parser::xs にして isucon 仕様ということで --max-reqs-per-child を跳ねあげて計測中は死なないようにしました。

お昼過ぎから夕方ぐらいまで

DBIx::Sunny +++ と言わざる得ない感じでした。初めて使いましたが、実行される sql に発行されるコードの行数をコメントとして追加されるので、 kenjiskywalker さんから問題ありそうなクエリが飛んでいると、x 行目は問題があるからどうにかしてと言われて、やりとりがしやすかったです。

ここらへんで泥臭い修正も幾つか加えました。( 運用するならやらないような isucon だからする修正 )

kenjiskywalker さんが nginx, mysql, os の設定を色々改善してくれている中、 pager のクエリで後ろの方 ( 200 ページ目とか ) がきつそうで msyql の innodb_buffer_pool をあげても遅い奴は 0.1 秒 ぐらいかかっていたので、ここだけ redis 化することにしました。

あと hisaichi5518 さんは放浪息子読んでました。安那ちゃんかわいい。

bench を実行する度に、top, dstat, iotop ではりついて、夕方ぐらいには mysql, redis, app, nginx どれも cpu が全然使い切れてないけど、特に io が高いわけでもない中途半端な状態にたどり着きました(もっとリクエストがあればという状態。ここで疑問に思うべきだった。)。markdown の表示をキャッシュすることも考えましたが、アクセスログを見る限り費用対効果が低そうなので辞めました。ワーカーを夕方からやるのは実装を壊しそうだったので諦めました。

最後のほう

17 時ぐらいから突如として他チームから 1, 2, 3 万超のスコアが出てきて、劇的な改善が見込めずあきらめムードで最後のあがきをして 9000 ちょっとで終了でした。

終わってからゆゆしきの最終回をみんなで見なおして、改めて金髪の女の子かわいいって連呼してました。

まとめ

とても楽しかったです。お互い知った中なのでとてもやりやすくて良かったです。 改めて運営の皆様お疲れ様でした。

🍖🍺

追記