ISUCON13に「3年A組大前先生」というチームで初参加しました。
来年に向けてのふりかえりと記録を残しておきます。
参加するきっかけ
パフォーマンスチューニングの勉強会として、社内ISUCONを主催したのがきっかけ。
最初に座学をした後、実際にパフォーマンスチューニングを競ってもらって楽しい勉強会になった。
主催するにあたりISUCON本も読んで知識も付けたし、実際のISUCONに参加したら楽しそうだなと思いとりあえず申し込んで枠を確保してからメンバーを募った
メンバーと役割
-
eichisanden(自分)
主にインフラ担当
AWS環境構築したりデプロイスクリプト書いたり、pprof仕込んだり -
oohira
GitHubにコードをプッシュしたり
主にN+1解消とキャッシュ周りを担当していた -
taclose
インデックスや、MySQLとnginxのパラメータチューニングしたり
最初はエンジョイのつもりだったが、どうせならAREを目指そうということになった
練習
集まっての練習は週末に3回やった。
- 1回目 作戦会議。タスク洗い出して担当を割り振り。次回までに各自が準備
- 2回目 本戦を想定しながらISUNARABEでisucon12予選をやってみた
- 3回目 APとDBを分離したり、AP2台にしたり、サーバー分割の練習
元々練習は2回の予定だったが、サーバー分割する練習しとかないとマズイだろうということで追加した
それとは別に自主練で過去問を2つほどやった
他のメンバーも同じ感じで自主練してくれていた。
試合前半
今年を象徴するアプリがお題という事前情報があったので生成AI的なチャットアプリとかかなと想像していたが、まさかのDNSがお題(アプリ自体は動画サイトだが)
PowerDNSというものを初めて聞いたし、DNSとMySQLがどう関連するの? DNS水責めってどう対策するの?と疑問だらけの中、試合開始。
初動は自分はAWS環境構築したり、マニュアル読んだり、各種セットアップでお昼近くまで掛かってしまったけど、まあ想定範囲内な立ち上がり。
oohiraがER図とテーブルのレコード数を貼ってくれたり、自分がCRUDを作成したのはアプリの構成を理解するのに役立った。
試合中盤
インデックス、N+1、キャッシュを他メンバーが頑張ってくれて順調にスコアを伸ばして15:00頃にポータルを見た時は25位だった。ここまでは順調。
誤算だったのは、練習では1つ改善して即ベンチマーク実行のサイクルで回していたが、
当日はなかなかベンチマーカーの順番が回って来ず、1つずつ流してたら修正が溜まってしまったり、pprofもベンチマーカー実行中に手動で叩くようにしてたので、ベンチマーカーが動くのを待つ必要があったりして、特に自分はそれに時間を取られて他の改善に手が回らなかった。
試合後半
残り2時間になり、予定ではサーバ分割をする時間になった。
ただ、まだまだアプリの直すところはあったので1台構成のままフィニッシュした方がスコアは伸びる可能性もあったが、早く分離できれば続きのチューニングが出来るし悔いも残したくないのでサーバ分割を始めた。
(ここから殆どスコアが上がらず泥沼に入っていく...)
とりあえず、DBの負荷が高いので分離、DNSも専用機を割り当てたかったが構成がややこしかったので、とりあえずPowerDNSのMySQLだけ分離して下記のような構成とした。
- サーバ1 nginx、PowerDNS, アプリ
- サーバ2 PowerDNSのMySQL
- サーバ3 アプリのMySQL
後から他のチームの構成を見てもこれに近かったのでコンセプトは外してなさそうだが、実際やるのは大変だった。
普段仕事で使っているPostgreSQLと違って、MySQLはユーザの属性にlocalhostだけなのか別のサーバーにも接続できるのかの属性を持っているが、初期状態はlocalhostになっていたのを変えるだけで一苦労だった。
焦ってmysqlと叩くつもりが手癖で何回もpsqlと叩いてる始末だったので、もう来年はalias psql=mysql
するか。
あと、今回ややこしかったのはベンチマーカーはPowerDNSで名前解決してnginxにアクセスが来る作りだったが、DNSのレコードの向き先を間違ったり、無理やりソースコード上でDBの接続先を変えようとして失敗したり、使わないサーバのAPのサービスを落としたら引きずられて依存関係にあるMySQLが落ちたりして、終了3分前のベンチでfailしてスコア0を叩き出した。
終わった...
でも諦めずに対処して残り1分前にベンチを実行。
何とかベンチの順番回ってきてベンチが開始されたのは見たが、あえなくポータルは閉じて結果が見れなかった。
本当に終わった...
結果
後日、全チームの順位を確認したら最後のベンチが実は成功していたようで何とか13,962が最終スコアとして残った。
処理時間は18:00:30なので本当にギリギリ。
最高スコアが17,794だったので落ちてしまったが、スコア0だと思っていたのでまあ良かった。
来年も同じメンバーで出場すると思うので、次回はもうちょっと頑張りたい。