概要
ISUCON11本選にチームkotamanegiとして一人で参加し、学生2位になりました。 主要な改善点・工夫は
- 自動デプロイスクリプトを書く
- DBのindexをきちんと構築する
- 負荷が大きくなってきた場合の強制タイムアウト処理を実装する
- DBとZipファイルの処理を行うサーバとそれ以外の処理を行うサーバに3台のマシンを分離させる。
の4点でした。 結果は全体11位/学生2位となり、賞金10万円+Splunk賞とYahoo賞の2つの企業賞を獲得できました。 Splunk賞は全体11位、Yahoo賞はスコア下4桁が8200に最も近い学生チームが受賞ということで2つも受賞できてラッキーでした。
ISUCON11オンライン本選結果発表中継、全ての結果発表が終わりました🚀 #isucon
— ISUCON公式 (@isucon_official) 2021年9月19日
この後は、予選と本選の問題解説、優勝者インタビューを行う予定です。引き続き、お楽しみください。https://t.co/AcLZHbG1Cp pic.twitter.com/3EuiVh2A2S
開戦前
チーム紹介など
https://t.co/rhdRyTKQHB チームkotamanegiの本選へ向けての意気込みがおもしろい(これが冗談のようでいて冗談にならないのではという感じがある)
— tomerun (@tomerun) 2021年9月16日
この時は賞金を取れると予想していなかったので期待に答えられなくてスマンやで〜と思っていました。 ですが優勝こそ逃したものの賞金は獲得できたので有言実行に近い結果を残せました。
僕は期待を裏切らない男です。(イキリ)
事前準備
複数台与えられた時のシステム構成を考えていました。 DB1台+Web2台で、Web2台間はnginxでいい感じに振り分けるつもりでした。
作業のタイムライン
作業メモをとっていないので順序は適当です。
前半戦
まずベンチマークをとった後、サーバにログインしようとするとエラーが出て質問を投げました。ISUCONポータルへの再ログインやGitHubへの新規SSH鍵の登録などをしていると治ったのですが、原因は謎です。
ログイン出来るようになった後は、初手でDBサーバを分離しました。
mysqlでroot権限でログインするためにsudo mysql
が必要だったのはしばらく困りましたが、基本的には予選と同じ流れでうまく行きました。
分離後、この段階でようやく当日マニュアルを読みはじめました。 学内システムの高速化というテーマだったので、成績確認よりもまずは提出物確認・アナウンスの確認を高速化した方がよいのかなぁと感じました。
提出物がzipで管理されていたので、ディスクIOを分離するために提出物確認APIを別サーバに分離するとジャッジ中の点数は上がりましたが途中で整合性が取れずにFailするようになってしまいました。
後半戦
サーバの負荷をtop
コマンドで確認すると、DBサーバのCPU使用率がMAXのまましばらく停滞していることに気が付きました。とりあえずIndexを張ってみると途中でFailすることはなくなったものの、最後の整合性チェックでは相変わらずFailのままでした。
成績確認に関連するAPIがエラーを出していたので確認するとどうやらリクエストタイムアウト後も処理が続行されてDBサーバに負荷を掛け続けているらしいということがわかりました。 そこで同時実行数の設定値以上の数のリクエストが来たらtime.sleep(inf)を実行し強制的にタイムアウトにするという仕組みを実装しようと考えました。 さすがにこの解き方は想定外ではないかと思って質問を投げるとルール上OKとの返事が返ってきたので安心して実装できました。 この改善策を入れるとFailすることはなくなりました。
最後に細かい改善を入れたり、アナウンス用のDBサーバを別途用意しようとして失敗したりしている内に時間切れになりました。 アナウンス用のDBサーバを立てるのは想定解法だったらしいので悲しいです。
分析
成績確認用のAPIが原因でFailしがちだったのでそこを修繕出来て良かったと思っています。 Redisへの載せ替えなどは考えたのですが、再起動試験でFailしそうだと予想して予めインストールされていたソフトウェアだけを使ったのが結果として良かったと感じました。
アナウンス用のDBを別途用意するのは途中まで実装していたのですが、外部キー制約に引っかかってしまい解消することが出来ませんでした。外部キー制約そのものは外すと本選終了後のテストでコードレビューされてFailするのかなと考えていたので、まさか外しても良いものだとは思ってもいませんでした。外してよいかを質問でちゃんと確認しなかったのは反省点です。
Discordの感想戦
「推測するな、計測せよ」という標語がDiscordのあちこちで飛び交っていて、ほぼ推測のみの野生の勘と運だけで乗り切れてしまったとは言える雰囲気でなく心の中で懺悔していました。 結局会話の中でそれがバレてしまったんですが、「よくそんな丸腰でここまで来れたな」と言われてしまい、自分の運の強さを再認識した感じです。
来年は今年より成長している予定なので計測ツールを持っていこうと思います。
感想
ISUCON初参加初本選初優勝は果たせませんでしたが、初参加初本選初入賞は果たせたので大満足です。賞金10万円は欲望の赴くままに使わせていただこうと思います。