ISUCON5本選に学生枠で参加しました

bgpatです。
所属しているサークルの先輩2人(@fono09, @Goryudyuma)とチーム名kstmでISUCON5の本選に参加してきました。

午前

まず、予選の教訓からapt-get purge apparmorしました。初回ベンチかけてる間に環境の確認。使い慣れてるMySQLじゃなくて全く使ったことのないPostgresqlが入っていて、コレどうしよう状態。psqlコマンドはこのとき初めて使いました。ベンチ終わってnginxのログとかブラウザで確認したりして、/dataが重いなーということでコード読み始めました。一緒にコード読んでた@Goryudyumaが外部サーバーに対してHTTPリクエスト送ってるのが原因と教えてくれたので、このあたりを調べることに。ローカル環境からAPIのホストを叩いても案の定名前解決できなかったので、サーバー内の/etc/hostsを見るとAPIサーバーのアドレスが書かれていました。ローカルのhostsに同じ設定を書くとブラウザからAPIを叩けるようになったのでメンバーにも共有。とりあえずAPIのリクエストをキャッシュすれば早くなるのでは?と提案だけして、@fono09にredisの設定とかやってもらい、golang書けないのでコードは@Goryudyumaに書いてもらいました。

13:00〜17:00

何も考えずとりあえず全部キャッシュするコードが完成したのでベンチ回してみるとよくわからないエラーを吐いてfail。ブラウザでAPI叩いて確認すると、tenkiは高頻度で更新されているみたいなので、キャッシュから除外するように修正するがfail。このあともいろいろ触ってみたけど最終的にはnullしか表示されなくなって、せっかくGO言語使ってるんだしということで、APIリクエストの並列処理のほうをやってみることに。並列化処理完成してブラウザでチェック、よし問題なさそう と張り切ってベンチ回すもなぜかfail。しかもapp.goが死んでる。ログを見るとJSONのパースで落ちてるらしいことが分かり、Resp.Bodyをログに吐き出すようにすると、何も入ってなくてイミガワカラナイ。懇親会で聞いたところによると、ちょっと工夫してログに出せば"Too Many Requests"が見れたんだとか。このあともキャッシュがうまくいかない原因を考えてみたり並列処理なんとかできないか触ってみましたが、ことごとくfailしまくってお通夜状態でした。

17:00〜終了

結局打てる手もなくなり、同じサーバーの中にAPサーバーいっぱい立てれば並列処理になって少しは早くなるかもとか考え出して、やってみてもうまく動かず結局ほぼ初期状態に戻す感じでフィニッシュ。時間もなく、ほぼ初期状態だったので再起動確認はしませんでした。学生チームが全チームfailになると知っていれば再起動確認の時間残したのに。

反省

大体どのチームとも方針は変わらなかったのに、考察しきれてない部分が多くて全く点数が伸びず、最終的にfailに終わってしまいました。予選のときは、ほぼノー勉で挑んで、たまたま自分たちに合った環境が問題になってスコアが伸びたけど、本選で惨敗して、甘くないなーと実感しました。来年もISUCONがあるなら、運ではなくて実力で予選突破できるように練習とかちゃんとしたいです。

まとめ

コンテスト自体はボロボロでしたが、長時間パソコンに向かってみんなで考えたり、プロが書いたコードが見れたり、懇親会ですごい人たちと話したり、東京見物したり、ほんとに楽しい充実した日となりました。運営のみなさん、本当にありがとうございました。

おまけ

会場に着いてから暇だったのでこんなもの書いてました。せっかくなので置いておきます。