ISUCON10の予選に参加してきました

September 13, 2020

こんにちは

9/12 に行われた ISUCON10 の予選に@masibw くん@tosa_now くんと一緒にチーム「雑用係」として参加しました。

全員が ISUCON 初参加でした。

チーム構成

言語ではチームの皆が使用経験のある Golang を選びました。

ISUCON ではチームを組む際は作業がコンフリクトしたりすることを防いだり、各々が役割に集中できるように明確に役割を分担することが重要です。先人のブログを参照していても、

  • app 係/app 係/インフラ係(司令塔)
  • app 係/DB 係/インフラ係

などが取られています。

ISUCON 公式の事前勉強会でも 3 人チームの場合の役割分担として

  • バランス型: App/App/DB&Infra
  • インフラ重視型: App/DB/Infra

などが紹介されていました。

これらを参考に僕たちは以下の役割分担で ISUCON に挑みました

  • さんぽし: 雑用係
  • まし: 雑用係
  • とさ: 雑用係

かなり明瞭な作業の分離ができ、作業的にコンフリクトを起こしたり、無駄が発生することなく、ISUCON 本番に挑めた気がしています。

事前練習

事前練習として

  • ツールの導入
  • 実際に開発に映る前の役割分担(git 管理, 鍵設置など)
  • 誰がデプロイして、ベンチを回すか

などの練習を行いました。(勿論実際のパフォチューの練習も

本番

実際は雑にざっくり以下の役割分担を行っていました

  • さんぽし: インフラ全般 / デプロイ&ベンチ
  • まし: DB / App
  • とさ: App

実際は僕もインフラでやることがなくなってから App を触っていました。

時系列やったこと

他のチームメンバーが何をしていたか完全に追えていたわけではないので、僕がやったことを中心に雑に時系列でまとめます

12:20 競技開始

予定より 2 時間遅れて協議が開始しました。 ssh できることを確認し、各セットアップを進めながら、各自予選マニュアルを読みました

導入したのは

  • pprof
  • alp
  • pt-query-digest
  • slackcat

です。

ちなみに完全にとーふとふさんの Makefile をパクっ t参考にしていました。

後、SlowQuery をちゃんと ON にしてるのになぜかログが溜まらず、alp 使えん!!!!!!!!!ってなってました(なんか知らんけど 1 回だけ SlowQuery が上手く取れたのでその 1 回分を参考にして Query 改善を進めていました

~ 14:00

ベンチが不具合で回らなかったので(← 運営の方お疲れ様です…)「まあ初回ベンチはええやろ!」みたいな気持ちで普通に開発を進めていました

Git 管理に nginx 設定などを載せていなかったので正確な時間は分かりませんが、

  • nginx からの静的ファイル配信に gzip 転送を使う(事前に gzip しておき、gzip-static を使用する形
  • nginx で Bot を弾く(503 を返す

を設定しました。後者に関しては予選マニュアルの以下の記載に対応した形です

bot からのリクエスト bot からのアクセスはコンバージョンに繋がらないため、弾くことが仕様として決定しましたが、まだ実装されていません。 bot は User-Agent が以下の正規表現にマッチする形式であり、このリクエストに対して 503 Service Unavailable を返すことが許可されています。 これに対するベンチマーカーからの減点は発生しません。

これらで 100pt くらいの微増が見られました

~ 16:00

App 側の改善に一旦回ることにして、buyChair が 1 回 select して椅子が存在するかを確認してから update という形になっていたので、update を 1 回行って RowsAffected でその椅子が存在するかを確認する形に変更しました

fix: update の影響 raw を見て notfound を返す / GitHub

また、ベンチの結果でずっとなぞって検索でタイムアウトが出ていたので、とさくんが修正を加えてくれました

Feat/nazoote / GitHub

これでベンチ時のタイムアウトがはがせました(が点数に影響はなく 🤔 となっていました

~ 17:00

lowpricechair の結果をキャッシュするように変更を加えました

lowpricechair を IIKANJI にキャッシュ / GitHub

これで 100pt くらいアップしました

また、同様に getLowPricedEstate にも同じ修正を入れましたが、特に変化がありませんでした。

~ 19:00

ん〜なんか結構改善入れてるけど点数伸びんくなってきたなぁ、まあ最終的な構成を見据えて 1 回複数台構成の設定してみとくかぁとなって複数台構成に変更を試みました、

ここらでやっとDB の CPU が張り付いていることに気がつきます(大反省ポイント(気がつくのが遅い 💩💩💩💩💩

なんかサーバースペック低くねとは話していたのですが、複数台構成にさせたいんだろうなとか予算が足りなかったのかなとか以上のことは感じておらず、完全に見逃してました。

このボトルネックのせいで他の修正が全く効いていなかったことに気がつきます。

  • server1: DB
  • server2: App
  • server3: App

にしようとしましたが、途中で事件もあり w

  • server1: DB
  • server2: App

に変更しました。

というかどっちにしろ DB の CPU が張り付いているせいで前者の構成に切り替えても CPU を余らせて点数は上がらなかった気がしています

~ 21:00

DB の CPU が張り付き問題に対して以下の案が出ました

  • Chair をキャッシュに丸ごと載せる
  • DB を Chair と Estate で分けて 2 台にする

結局なんとなく DB 二台にするの大変そうじゃん w くらいのノリで前者の方針で行きました(終了後に後者にしておけばよかったとみんなで悔やむ

まじまじで終了 10 分まえくらいまで実装を行いましたがほとんど間に合いませんでした

fix: 時代はキャッシュだ!!!!!

最終的にキャッシュを利用するところの関数も入れ替え忘れているので本当に焦っていたんだと思います 😇😇

反省ポイント

DB の CPU が張り付いている問題に気がつくのが遅かった

練習段階から CPU を見る癖があまりついていなかったのが悪いですね…

これのせいで他にも試作は色々打っていますがポイントに効いてこなかったと思います

外部 MySQL への接続で謎に詰まった

謎に詰まりました、わいの修行不足です

よかった点

チーム連携

チームの連携としては練習の成果もあり、かなりいい感じに取れたのではないかと思っています。作業分担も完璧!!!チームワークでは優勝!!!!!!!!!

楽しかった

何より一日を通してみんなでワイワイ開発してすごく楽しかったです

終わりに

ということで結果としては大体学生 22 位/全体 144 位くらいでした(結果発表後にダッシュボードに記載されていたランキングが正しくない可能性があるそうなので正確ではない感覚値です

終わってから振り返って悔しいポイントは山ほどありましたが、楽しかったのでヨシ!!!!!

運営のみなさんもお疲れ様でした!!

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