ISUCON6に参加して0点で終わった

  • このエントリーをはてなブックマークに追加

初めてISUCONにチーム名『tofu_on_fire』として2日目に参加しました。タイトル通り私達の最終的なスコアは0点で終わってしまいました。適当に参加の経緯と本番当日までにやってきたこと、本番の流れについて書こうと思います。

先輩に誘われて参加を決意

先輩から「ISUCON出てみない?」と誘われ、前から興味があったので参加を決意。紆余曲折を経て3人チームで組むことに。

自分の役割

ログ出力や監視ツールの導入でボトルネックの特定をしやすくするために色々と準備したり、インフラ周りを見てたりした。

事前準備

過去問を解いたり、 Chef を使って必要なパッケージやミドルウェアの設定を行っていた。

過去問

先輩がEC2に練習用のインスタンスを立てて2時間ほど練習。課題はpixiv社内ISUCONのあれ。 全然チームワークとれなくて、スコアが全く伸びなかった。

Chefを使った初期構築自動化

練習を通して、最初の準備で躓くと一気にやる気をなくしてしまうことがわかったので必要なパッケージやミドルウェアを Chef を使って自動で準備してくれるようにした。 この時点で本番まで1週間切っており、とにかくスピード重視で最低限必要なものを1つのレシピに詰め込んだ。当日使わなかったのもいくつかあるけれど

辺りは導入してよかったと思えた。

本当は nginx.conf や my.cnf といった設定ファイルの仕込みもやりたかったんだけどできなかった。 ただ、ログ出力だけはやりたいと思っていたので access.log の log_format とスロークエリログの出力の設定だけ行った。

本番当日

朝9時集合だったが30分遅刻した。ごめんなさい。

到着してから PC やディスプレイを急いでセットアップした。恐らく競技が始まったらコンビニに行く時間すら無いだろうと思い、コンビニで昼飯やお菓子を事前に買っておいた。

Twitterを眺めているとISUCON参加者みんなNEW GAME!を見てるっぽかったので、私達のチームも競技中に垂れ流していた。 実際のところ映像を眺める余裕なんてまったくなかったので音声オンリーで楽しんでいた。

競技が始まると、まず最初に Chef を実行して色々とセットアップしたりサーバの構成を確かめたりした。 ここで MySQL にログインできず、 DB の中身が確認できないトラブルが起きた。セーフモードで起動したり、サーバを再起動したりしていたら13時になってしまい、スタートダッシュに完全に失敗してしまった。

なんとかログインできるようになって各テーブルの中身を確認してみると思っていたよりもレコードが少ないことが判明。チーム内でDBでのボトルネックはなさそうと話し合っていた。

GET /POST /login のリクエストがタイムアウトになっていたので nginx やコードにボトルネックがあると当たりをつける。合わせて CSS や JS といったアセットファイルのリクエストも多かったので nginx でキャッシュさせたり gzip 圧縮するように設定を書き換えた。

コード内の SQL クエリを改善しても0点のままでめっちゃ焦った。チームメイトがrack-lineprofhtmlify がボトルネックであることを特定。この時点で16時位だった気がする。

redis 使って keyword をキャッシュする作戦を実行。するとトップページが爆速になり、ようやくスコアも0点から脱出!チーム内でその日一番の歓喜の声が上がる。

17時半くらいにサーバ再起動したら redis が思った通りに動いてくれなくて0点に逆戻り。最後まで諦めずに手を動かすもタイムアップ。

↓最終スコア

last score

↓お気持ち

反省会

  • 結局初動で躓いてしまった…
    • もっと過去問溶いてミドルウェアに触っておけばよかった。
    • 余計なデーモンは停止、自動起動を OFF にするのは最初のうちに自分が一気にやるべきだった
  • メモリキャッシュもっと使えばよかった
    • free -m や mackerel のグラフみても全然余裕があった
  • ベンチ取り終わったログは別ファイル名にして退避すべきだった
    • kataribe を使っていると前回のベンチと混ざってしまいよくなかった
  • アプリケーションや設定ファイルのデプロイ自動化の仕組みが欲しかった。
    • コードなどは private github リポジトリで管理していたものの、ローカルで検証→リポジトリに push →本番に適用の流れが手作業の場合面倒だしミスも発生してたので最後は本番に直接変更を加えていた。
    • 本番当日にやろうとか思ってたけどそんな暇は当然なかった。この辺りは自分の考えの甘さを痛感した。
  • チームでコミュニケーション取り合ってよかった。
    • 自分の作業とチームメイトの作業はできるだけかぶらないように常に確認しあった。
    • 個人的には競技中に険悪ムードになることが一番怖かったので、こういう確認は過剰なくらい取り合った。
  • webエンジニアが知っておきたいインフラの基本top や監視ツールを使ったボトルネックの見つけ方や、 SQL クエリなどのチューニング方法が載っていて非常に参考になった。
  • nginx実践入門も参考になった。

今回 Ruby で実装していたのですが、スコアを伸ばすことを第一目標に置くのであれば言語に依存しないように色々触っておくのも大事だなと思いました。 ある程度ISUCONに関する知見を得られたので、ISUCON7がもしあるのならば、次は高得点を狙えるように頑張りたいと思います!

謝辞

運営の皆様、素晴らしい問題を作成していただきありがとうございます。