さんぽしのBLOG

さんぽしのBLOG

非理系の大学生が頑張りに頑張り抜いてエリートエンジニアになるシンデレラストーリー(予定)です。

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

こんにちは さんぽしです

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使えん!!!!!!!!!ってなってました(なんか知らんけど一回だけSlowQueryが上手く取れたのでその一回分を参考にして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が一回selectして椅子が存在するかを確認してからupdateという形になっていたので、updateを一回行ってRowsAffectedでその椅子が存在するかを確認する形に変更しました

fix: updateの影響rawを見てnotfoundを返す · masibw/isucon10_q@e6bd2a6 · GitHub

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

Feat/nazoote by harukitosa · Pull Request #6 · masibw/isucon10_q · GitHub

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

~ 17:00

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

lowpricechair をIIKANJI にキャッシュ by sanposhiho · Pull Request #7 · masibw/isucon10_q · GitHub

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

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

~ 19:00

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

ここらでやっと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: 時代はキャッシュだ!!!!! by sanposhiho · Pull Request #13 · masibw/isucon10_q · GitHub

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

反省ポイント

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

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

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

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

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

よかった点

チーム連携

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

楽しかった

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

終わりに

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

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

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