ISUCON11本選に学生枠で出場した
こんにちはdas08です。 先日の土曜日に開催されたISUCON11の本選に参加してきました! ISUCONは8時間で改善の余地のあるWebアプリをチューニングして高速化しスコアを競う大会です。
同学科の友人2人とチームを組んでどこまでできるか腕試しがてらの挑戦です。備忘録として当日の様子を残そうと思います。
チームメンバー
- das08 (電気電子工学科3回生) Webアプリの改善担当
- tinaxd (同上) Webアプリの改善担当
- arakistic (同上) DB周りの改善
メンバー全員同じ学科でチームを組みました。暇なときよくApexを一緒にするのでチーム名は「快適PandApex」になりました。もう少しマシな名前にすればよかったです。
役割分担も大まかに決めて本選に挑みました。予選での反省を生かして計測ツールを使いこなせるように練習しまくり,dockerやenvoyなどの対策を行ってきました。
予選当日
8:00 起床
競技開始自体は10時からでしたが予選同様対面でやりたかったので頑張って起きました。ISUCON Tシャツを着てスポンサーさんのバッグを持ち電車で向かいました。(乗り過ごしちゃいましたが...)
9:45 問題コンセプト公開
公式YouTube Liveで本選問題の紹介がありました。テーマは「大学の履修登録システム」らしく,新学期の履修に耐えれるようシステムを8時間で高速化せよというお題でした. 私の大学でも新学期になるとCMSが重くなったり鯖落ちしたりしてたので親近感のわくお題でした(笑)。 ちなみに少しベクトルが違いますが,このチームメンバーで大学の学習支援システムの改善をするツールを作っていたので,改善という点では私たちにぴったりなお題だなという印象でやる気が出たのを覚えています。
10:00 競技開始
競技開始と同時に構成を確認しました。NginxとMySQLが使われていたのでホッとした反面,他の学生チームに差をつけられないと焦りました。 dockerもNginxじゃないことも想定して対策を重ねていたので...(笑)
チューニングを始める前にツールなどを導入しました。導入したものは以下のとおりです。
- git-prompt とPS1の設定(コマンドラインにgitのbranchを表示するやつ)
- pt-query-digest
- pprof
- phpMyAdmin
- alp
- htopコマンド 今回は予選のとき以上にツールを使いこなすべく,alpやpt-query-digestを猛勉強してきました。
10:10 初回ベンチ(Score: 32765)
まずはということで何も手を加えていない状態でベンチを回しました。
予選とは違い初回から点数が高く,これは高得点の争いになると身構えていました。
10:22 プロファイラの設定(Score: 26988)
MySQLのログ出力やGoのpprof,Nginxのログ出力を設定して2回目のベンチを回しました。 スコアは当然下がりましたが,これで解析できるようになったのでじゃんじゃん改善していこうと話してました。
11:03 interpolateParamsの有効化とN+1の改善(Score: 34384)
pt-query-digestを見るとADMIN PREPAREが上位に来ていたので,interpolateParams
をtrue
に。
インデックスを見るとほとんどはられており,改善する点が見つからなかったので,とりあえず遅さ上位のクエリのN+1を改善しました。
11:41 提出課題の圧縮を改善 (Score: 37387)
tinaxがファイルのZip圧縮でCPUとメモリの圧迫している状況に気づき,改善を入れてくれました。 これでAppの負荷が若干下がりました。
12:00 停滞
成績取得のAPIが律速になっているっぽく,改善することにしました。特にGPAの計算でMySQLのCPUに負荷がかかっているところまでわかりましたが一筋縄じゃいかないクエリにしばらく手が止まりました。
htop
で見てるとAppもDBもCPUが張り付いてたので,とりあえず分離することにしました。
幸いにも与えられた3台のDBは同じスペックだったのでServer3にDBを分離することに決めました。
12:34 2台構成(Score: 55629)
AppとDBの2台構成にしたことでCPUの張り付きがある程度解消され,スコアが伸びました。この時点で全体5位くらいだったと思います。
13:25 3台構成(App2台,DB1台) (Score: 0)
2台構成の時点でAppのCPUが若干逼迫気味だったので,余ってるServer2にAppを分離することにしました。 計測と考察から,Zip系の処理が重たそうだったのでそのあたりのエンドポイントをServer2に処理させるようにいい感じにロードバランシングしました。 しかしながら,処理が高速になりすぎたのか成績取得のAPIでタイムアウトしてしまいスコアが0担ってしまいました.
15:30 GPAのキャッシュ (Score:0(71257))
Singleflightを使ってGPAの計算処理にキャッシュを挟んだりしましたが,ベンチのバリデーションで引っかかってしまいました。 おそらく最後に課題を追加してバリデーションをしているらしく,何が原因なのかお手上げでした.
17:00 停滞2
とりあえず成績取得のAPIのタイムアウトをなくすことが重要だったので3人総掛かりで取り組みました。 が,何をしてもタイムアウトしてしまいこれもお手上げでした。
17:30 泣く泣くリバート (Score: 68740)
このままでは競技終了で0点となってしまうため,スコアが最も高かった12時の時点にリバートしました。 結局App-DBの2台構成でFailしなくなったのでプロファイラとログをすべて切りました。
18:00 競技終了
無事?競技が終了しました。あまり改善できなかったのが辛かったです。他のチームも苦戦していたようで,本選の厳しさを実感しました。 色々苦労しましたがとても充実した8時間でした。
スコアの推移
こんな感じでした。 この時点では学生1位だったらしいです。
運営による追試の最終スコアは62955
でした。競技終了時点から大幅に下がってしまい学生4位という結果になりました。
感想
初めてのISUCONでしたが本気で取り組むことができて楽しかったです! チームメンバーと毎日のように練習し,だんだんとできることが増えていって技術的にも成長を感じました。 最終スコアが大幅に下がってしまったのは悔しいですが,これも運ということでついてなかったなと思いました。 来年はリベンジして優勝します!