ISUCON8(予選)参加記
ISUCON8に参加してきました。 今年から社会人枠ということで絶対本選出てやると思って挑んだわけですが結果は爆死という。
編成
今回は Bremen
というチーム名で、前回も一緒に出ていた @Goryudyuma さんと ISHOCON2 で会った @owlworks さんとで参加しました。
言語は Golang を使いました。
- bgpat: インフラ, アプリケーション
- Goryudyuma: アプリケーション
- owlworks: アプリケーション
当日まで
練習としては、個人参加の ISHOCON2 と Yahoo! JAPAN さんの LODGE に集まって ISUCON7 の予選をやったのと、 突然平日の夜中に始まった ISUCON4 の予選をリモートでやりました。
ISUCON4 予選は OS が CentOS だったというところから選択したのですが、
今問題を作るなら CentOS7 だろうなということでベンチマーカーとアプリケーションだけ使ってインフラ部分は ConoHa の CentOS7 イメージを使いました。
(普段触らないので /tmp
にファイルを吐くと他のサービスから触れないとか事前に知れてよかった)
みんな vimmer ということで前回作った bgpat/isucon-boilerplate を使い回しました。
/
を git に沈めてソースコードだけでなく設定ファイルもまとめて管理しようと思って作ったリポジトリで、
root
で ssh ログインすると git commit
したときのユーザーがそれぞれの GitHub アカウント名になるのと vim で git add
されていないファイルを開いて
:w
したときに変更前の状態で自動コミットしてくれるというスクリプトが入っています。
昨年は 2FA を有効にしていると git push
できなかったので今年は Deploy Key を登録して誰でも push できるように変えました。
github.com
あとは予選から複数台構成が予想されたのでモニタリング環境を整えました。
netdata
+ Prometheus
+ Grafana
で CPU とメモリの負荷状況は1画面で見れるようにしました。
GitHub - bgpat/isucon-monitoring: Monitoring Environment with Prometheus + Grafana
予選当日
競技前
前日準備する予定が寝落ちしてしまったけど、幸い起床バトルには余裕を持って勝ったので GitHub に競技用のリポジトリを作って自分がやることの issue を立てていった。
会場は mixi さんのオフィスをお借りしました。 (ありがとうございました)
競技開始
サーバー全台に bgpat/isucon-boilerplate 流し込んで root にパスワードなしで入れるようにするのと、 いろいろ入れてモニタリング環境を整えたりしていました。
あとは DB のスローログと Nginx に kataribe を入れる予定だったのですが、まさかの H2O だったので前者だけ入れておきました。
ログについては slackcat
で Slack のチャンネルに投げて rotate するスクリプトを書いて、ベンチが終わった後に手動で実行する運用にしました。
アプリケーションを触り始める
インフラの作業が終わったので2人が読んでくれてたアプリケーションのコードを触っていきました。
まず、複数人で同じファイルを触ると確実に conflict するので app.go
を細かく分ける のと
ローカルでビルドしたバイナリをサーバーにデプロイするタスクを Makefile
に追加しました。
MySQL の CPU 負荷がボトルネックということはすぐにわかったので slow log を見て GetEvents
が原因というのも簡単に探せました。
@Goryudyuma とペアプロして N+1 を消していきました。
Makefile
が用意されていて運営さん親切!! とか思ったけど慣れていない gb
を使いこなせなかったのでdep
に置き換えたりもした。
中盤
やることがなくなって暇になったので OpenCensus を入れて Jaeger でトレーシングできるようにしたりしてた。 (真面目にアプリケーション読んでおけばよかった)
きれい
後半
reservation の処理が重かったので Redis にのせて早く裁こうとしたけど気付いたのが遅すぎた。 結局実装しきれずタイムアップ。
最終的には GetEvents
も消しきれず Redis を使ったのも効果が出るところまで行かずで
とりあえず形だけ複数台構成にしておきました。
- nginx + DB
- application
- application
点数は 出すのも恥ずかしいくらい とだけ書いておきます。
感想
途中アプリケーションの中身を見ずに使いもしないトレーシング入れたのは戦犯だったなと思います。反省します。 ただ、他のメンバーが取り組みやすいようなインフラは結構いい感じに作れたんじゃないかなと思っています。
ダッシュボードが高機能化してたり問題のコード量がめちゃくちゃ多かったりベンチマーカーが席順がランダムじゃないとか怒ってきたり運営さんほんとにすごいなと思いました。 面白い問題を提供してもらって本当にありがとうございました。