ISUCON7予選に参加してボロ負けしてきた

去る、10月21日(土)にISUCON 7オンライン予選にチームg0tiu5aで参加してきました。最終結果は87281点で約400チーム中40位でした。

チームメンバー

の3人で参加しました。もともとCTFをやるチームとして僕が結成して今回はISUCONに出たと言うような感じです。

またメンバーのスキルを勘案して自分がインフラとアプリケーションを両方いい感じにバランスとりながら見る係、NKMR6194 くんがアプリケーション専任担当、つけじょにーくんがインフラとミドルウェアを主に専任してくれると言うような形をとりました。

準備

準備としてまずはじめに決めたのがどの言語で実装しようかでした。弊チームは僕がPythonistaでNKMR6194くんがRubyist、つけじょにーくんがPythonistaだったのでここはGolangでやることにしましたw

なので下準備としてGoでWebアプリケーションを書くに必要そうな知識を詰め込みました。具体的には、言語仕様とMySQL、Redisあたりのつなぎ込みを調べておくというようなことをしました。

あとは、チームで良さそうなツールを集めておいて、インストールしてくれるようにAnsibleを書いておきました。具体的には以下のことをしてくれます。

  • ツール類のインストール (htop、dstat、innotop、alp、myprofiler、pt-query-digest … )
  • チームメンバーの公開鍵の登録 (GitHubに登録してある鍵を isucon ユーザーの ~/.ssh/authorized_keys に登録しておく

http://docs.ansible.com/ansible/latest/authorized_key_module.html

  • sudo 権限をパスワードなしで使えるように

こんな感じでした。これは予選当日にもものすごく便利でいちいちインストールとかに時間をとられないで済むのでよかったです。

更にデプロイをコマンド一発でよしなにやってくれるツールも書いておきました。GitHub経由でコードをpullしてきて、ビルド、app / Nginx 等のミドルウェアの再起動、更にSlackへの通知までをやってくれるため各自が作業に集中しつつ全員がデプロイを好きにできるというような状況を作っておきました。

あとは、チーム自体の練習としてISUCON5、6の予選問題をちまちまと分散しならが解いて雰囲気をつかむようにしていました。

当日

当日はミクシィが会場を提供してくれていたのでそこにメンバーが集ってやりました。強いて言えばディスプレイが欲しかったですねw

開始直後はSSHができなかったので3人で当日マニュアルとレギュレーションを読んで何となく理解をつかむとともにシュっとSSHコンフィグを書いて ssh app01 とかでログインできるように共有しました。また、先程のAnsible Playbookがあるのでパスワードなしでログインもできてスムーズに進みました。

今回はサーバーが3台あったので1台ずつログインしてCPU1コア、メモリ1GBしかないこと、全台にベンチ回すと1台だけエラーになること、テーブル一覧と中身を全員で見て状況の把握をすることにしました。

ベンチ結果とコードをざっと見て見ると /icon へのアクセスが重いこと、アイコン画像がDBに直接保存されていることがわかったのでDBから抜き出す作業と、app02 にs3もどきを建ててそこから配信するという方針にしました。

DBから抜き出すと画像は70枚近くしかなく、1000件登録されているのにおかしくね? ということに3時間くらい悩み続けた結果、アイコンが重複登録されていたら70枚くらいでもおかしくないよねと思い、重複を調べたら70枚しかないということで時間を無駄にしたり、s3として調べたminio というサービスへのAWS SDK Golangでつなぎこむ経験がなかったのに挑戦して無駄に時間を溶かしたり… としてしまいましたが、18:00頃につなぎこみに成功して6641点(初期実装) → 16854点 (s3化) となりました。

次にNginxで画像をキャッシュさせれば早くなるんちゃう? と思いつき、いろいろ調べてNginx.confを調整しつつ、メッセージ件数を取るのが重かったのでRedisに結果を載せてMySQL側でカウントしないようにして、ということを2時間くらいかけて実装しBenchを回してみたところ、10万点を叩き出しw 一瞬土曜日の上位スコアボードに乗り、騒いでいました。

結局最終構成としては app01 がアプリケーションサーバー、app02が画像配信サーバー兼Redis、app03 が MySQL というような構成で提出して87281点でした。

ベストスコアと最終スコア

反省点

まず、自分も含めみんなGo力が足りなかったです。結構どうでもいいことでググったり詰まったりとGoでの実装力がもうちょっと足りなかったです。本質でないところで詰まってしまったのでそういうことはないようにしたいなと思いました。

また、SQLのクエリチューニングやインデックスの貼り方などまだまだ知らないといけないこと、勉強しないといけないことがあるということに気付かされました。

良かった点

チームメンバー実は全員顔合わせしたのは初めてだったのにすごいキッチリ連携できていたり、Goで詰まるとペアプロして何とかしたりとチーム力は高かったのはよかったです。後準備とか重要でした。チームメンバーのみなさんありがとうな!

最後に

ISUCON運営の皆様、物凄く良問を作成していただきありがとうございました。学ぶことが非常に多かったです。あと、複数台構成が来たときは面食らいましたw

弊チームの当日作業ログはこちら

来年こそ、本戦出場するぞ!\(●・▽・●)/

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.