ISUCON13の記録

今年も来ましたISUCONの季節。遅くなりましたがブログ記事となります。 いつもの頼れる後輩syusui、abcangとチーム7年目として出場し、全体12位 + 株式会社アークエッジ・スペース様の打ち上げ成功賞をいただきました! 株式会社アークエッジ・スペース様の打ち上げ成功賞はなんと衛星開発現場見学ツアーに参加させていただけるということで、かなり激アツな賞なのではないでしょうか。 開始前のスポンサー賞発表の時にこれ普通に行きてぇ~ってみんなで言ってたので本当にうれしいです。

isucon.net

今年は予選本戦の区分けがなくなりいきなり全員とバトルということで当初の目標はこれまでの予選突破ラインの30位以内としていましたが、これを無事達成しつつ賞までいただいてめでたい結果になったかなと思います。

大体の流れは abcang が書いてくれているのでそちらへのリンクを張っておくのと、僕のやったことを少しだけ書いておこうと思います。 abcang.hatenablog.com

リポジトリはこちら github.com

やったこと

最初の準備

準備されたマシンに置いてあるソースコード、publicファイル(フロントエンド)、SQLファイルなどをリポジトリに詰め込んでdeploy scriptをおきました。

pt-query-digestを見ながらスロークエリに対してインデックスを張る

シンプルですね。変に新しいツールを突然使うとほぼ間違いなく確実にしにます。 来年あるなら事前に準備してなんかモダンなやつを使ってみてもいいかもしれない。 performance_schema を使っている例も見ましたのでそのへんとか勉強して準備しておこうかなと思いました。

github.com github.com github.com

スロークエリをベースにテーブルの修正を行う

アクセスされるたびに、全テーブルなめて数を数えたり毎回ランキング生成をしている部分を事前に計算したり、情報が更新されるタイミングで計算しておいたりすることで毎回全部計算しなくてもいいようにしました。

github.com github.com github.com

SetMaxOpenConns

github.com

abcangくんの記事でも述べられていますが、何故かHTTPリクエストが全然来なくなってスコアが上がらないという現象が発生していました。 特にCPUが詰まっていて、アクセスが受けられていないわけでもなく、CPU idleはむしろ100ぐらいみたいな状況が続きかなり困った状態でした。 あと30分ぐらいしか時間がねえみたいな状況下でもうヤケクソじゃ!!!って値を変えたところめちゃくちゃスコアが上がりひっくり返りました。

SetMaxOpenConnsは初期実装のデフォルトで10が設定されており、DBコネクションが一瞬で埋まり、CPUとしては余裕がある状態にもかかわらず、 接続は受け付けたけどDBコネクションがidleになるまでまっているリクエストばかりになり、止まっているように見えたというオチでした。

自分で最初にこれは最後広げないとね~って言ってたんですが、うっかり忘れていたのでチームメンバーには大変なご迷惑をおかけしました。。。 今回設定した100という値もあと10分しかねぇみたいな状況下で、かなり適当で設定していたので、本当は何回かベンチ回したりして様子見しながら設定すればもっとコネクション開けたはずで、そうなるともっとスコアが上がったはずなので 大変悔しい思いがあります。仕事でも似たような調整したのに全くわかってなかったぜ。

おそらくではありますが、今どれだけのリクエストが来ていて、どれだけ処理しているのかみたいなメトリクスがあればもう少し気がつけたのかなと思います。 なんかさすがに処理できている量が少なくないか、とかアクセス自体は来ているなみたいなのがわかればここまでハマらずにすんだと思います。 次回以降の課題とさせていただきます。

まあこれにはまったおかげで急激に点数が伸び結果的に打ち上げ成功賞をいただけたので、ま、ええか!

終わりに

今年はちゃんと手を動かしていろんな改善を行えていた(例年何もわからんっていって手が止まったりしてた)ので全然点数上がらなかったときは大変大変苦しい時間を過ごしましたが、最終的にそれなりの点数になってよかったですね。 これも諦めずに全員で改修を積み重ねた結果だと思います。

毎年そろそろ作問大変そうだよなぁ~っていいながら毎年あーこうきたかみたいな驚きを与えてくれる運営陣には頭が上がりません。次回もまた期待しています!ありがとうございました。

最後終了30秒前に滑り込みで点数が出た様子