ISUCON8(予選)参加記

ISUCON8に参加してきました。 今年から社会人枠ということで絶対本選出てやると思って挑んだわけですが結果は爆死という。

編成

今回は Bremen というチーム名で、前回も一緒に出ていた @Goryudyuma さんと ISHOCON2 で会った @owlworks さんとで参加しました。 言語は Golang を使いました。

  • bgpat: インフラ, アプリケーション
  • Goryudyuma: アプリケーション
  • owlworks: アプリケーション

当日まで

練習としては、個人参加の ISHOCON2Yahoo! JAPAN さんの LODGE に集まって ISUCON7 の予選をやったのと、 突然平日の夜中に始まった ISUCON4 の予選をリモートでやりました。

ISUCON4 予選は OS が CentOS だったというところから選択したのですが、 今問題を作るなら CentOS7 だろうなということでベンチマーカーとアプリケーションだけ使ってインフラ部分は ConoHa の CentOS7 イメージを使いました。 (普段触らないので /tmp にファイルを吐くと他のサービスから触れないとか事前に知れてよかった)

みんな vimmer ということで前回作った bgpat/isucon-boilerplate を使い回しました。 / を git に沈めてソースコードだけでなく設定ファイルもまとめて管理しようと思って作ったリポジトリで、 rootssh ログインすると git commit したときのユーザーがそれぞれの GitHub アカウント名になるのと vimgit 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 を立てていった。

github.com

会場は mixi さんのオフィスをお借りしました。 (ありがとうございました)

mixi.connpass.com f:id:bgpat:20180917233336j:plain

競技開始

サーバー全台に bgpat/isucon-boilerplate 流し込んで root にパスワードなしで入れるようにするのと、 いろいろ入れてモニタリング環境を整えたりしていました。

f:id:bgpat:20180917234039p:plain

あとは DB のスローログと Nginx に kataribe を入れる予定だったのですが、まさかの H2O だったので前者だけ入れておきました。 ログについては slackcat で Slack のチャンネルに投げて rotate するスクリプトを書いて、ベンチが終わった後に手動で実行する運用にしました。

f:id:bgpat:20180917234645p:plain

アプリケーションを触り始める

インフラの作業が終わったので2人が読んでくれてたアプリケーションのコードを触っていきました。 まず、複数人で同じファイルを触ると確実に conflict するので app.go を細かく分ける のと ローカルでビルドしたバイナリをサーバーにデプロイするタスクを Makefile に追加しました。

MySQL の CPU 負荷がボトルネックということはすぐにわかったので slow log を見て GetEvents が原因というのも簡単に探せました。 @Goryudyuma とペアプロして N+1 を消していきました。

Makefile が用意されていて運営さん親切!! とか思ったけど慣れていない gb を使いこなせなかったのでdep に置き換えたりもした。

中盤

やることがなくなって暇になったので OpenCensus を入れて Jaeger でトレーシングできるようにしたりしてた。 (真面目にアプリケーション読んでおけばよかった)

f:id:bgpat:20180918000931p:plain

きれい

後半

reservation の処理が重かったので Redis にのせて早く裁こうとしたけど気付いたのが遅すぎた。 結局実装しきれずタイムアップ。

最終的には GetEvents も消しきれず Redis を使ったのも効果が出るところまで行かずで とりあえず形だけ複数台構成にしておきました。

  1. nginx + DB
  2. application
  3. application

f:id:bgpat:20180918001445p:plain

点数は 出すのも恥ずかしいくらい とだけ書いておきます。

感想

途中アプリケーションの中身を見ずに使いもしないトレーシング入れたのは戦犯だったなと思います。反省します。 ただ、他のメンバーが取り組みやすいようなインフラは結構いい感じに作れたんじゃないかなと思っています。

ダッシュボードが高機能化してたり問題のコード量がめちゃくちゃ多かったりベンチマーカーが席順がランダムじゃないとか怒ってきたり運営さんほんとにすごいなと思いました。 面白い問題を提供してもらって本当にありがとうございました。