2021/08/21に開催されたISUCON11 予選にチーム「TF」で出場しました。
ISUCON (Iikanjini Speed Up CONtest) についてはこちら→ https://isucon.net
変更履歴
・2021/08/27 18:41: ISUCON11 オンライン予選 全てのチームのスコア(参考値)の順位に更新(68位→67位)
チーム
どちらも初参加の2人で参加しました。言語はGolangを選択しました。
- maruTA-bis5 (@maruTA_bis5) ←me
- 普段はJava/PostgreSQLで仕事してる人。GolangわからんけどJavaで再実装する時間はない
- 開発担当
- yulis452
- AWSエンジニアのはずなのに最近物理のインフラを触っている人。開発わからん
- 情報担当
予選結果
運営の計測による最終スコアは53398点、全体の67位で予選敗退しました。
ベンチマークの履歴は以下。ちなみに初回ベンチ = 10:08:38 の4149点は、当時暫定1位でした。やったね。
やったこと
事前準備
yulis452は開発ノータッチの方針が決まっていたので、手を動かす練習としてISUCON10予選、10本戦、11事前講習をときました。GolangはMattermostのソースを少し読み書きした程度だったので実装面は割と怪しめでしたが、初動での計測ツール設定をある程度Ansibleで行うことを検討していたので、playbookを整備して、早く開発に入れる準備をできた、と最後の練習を終えた時点では考えていました。
予選当日
※当日はサーバーリストの表示順で上から1号機〜3号機と呼称していたため、以下同様に記載します
予選ライブでISUCONDITIONの紹介を見て、いざ始めようとansible-playbookを叩いたらいきなりエラー。pt-query-digestのためのslowlog設定が/etc/mysql/mysql.conf.d/mysqld.cnfを前提にしていたところ、MySQLではなくMariaDBがインストールされていてコケました。
今思えばそこでMySQLに入れ替えるともできたと思いますが、なぜかpt-query-digestを諦めてMariaDBのまま進む方針としました。この時点ですでにテンパってますね・・・
ansibleでの設定が終わった段階で1号機に対してベンチマークを実行するとなぜかfailしました。同じ状態の2号機・3号機を指定したらfailしなかったので、以降は2号機をベンチ対象として指定する方針にしました。(後で運営からアナウンスがありましたが、ベンチマーカーの不具合があったようです。該当したのが弊チームのみという・・・)
DBを3号機に移し、New Relic APMを設定したところで12時、スコアは1000点でした。
前日に調達してあったコンビニ弁当を食べつつ、インデックスを追加したところで27000点台まで伸び、その後細かい修正をいくつか行っていますが、それ以上はすぐには伸びませんでした。
14時前、当日一番のやらかしポイントが到来します。
https://github.com/maruTA-bis5/isucon11-qualify/commit/bece0826949cf71a2ed50bebe11bcba64c1c008b
複数回INSERTするならバルクインサートにしてしまえ、という発想の修正でしたが、
")"を"~"にtypoするという痛恨のミス。
これによってisu_conditionが全くINSERTされなくなり、加点要素がないためにスコアが1000点のまま変動しなくなりました。
多分冷静ではなかったのでしょう。この後色々な修正を試みますがいつまで経ってもtypoに気づかず、ポータル障害明けの18時過ぎになってようやく気がつきました。。。
紆余曲折あったときの修正の一部が原因でfailしていたのもあったのでrevertして、fail -> 45268点に復帰。すでに残り時間も少なく、これ以上コードに修正を加えるのはリスクがあると感じたため、これ以上コードに大きく手を入れるのは止めることにしました。
最後の調整としてDBのコネクション数を増加させてから、諸々ログ・計測を止めた状態で51198点。再起動試験としてsudo reboot後にISUCONDITIONにアクセスしてデータが入っているのを確認した後、再度ベンチマークを回して最高点の53478点で終了しました。最終スコアとは違いますが、ひとまず初参加ながらスコアを残せそうで一安心です。
感想
初手MariaDBや、午前中から数万点のスコアを出している他チームを見て、かなり焦ってしまったことが諸々のミスにつながっているように思います。普段の仕事でも、プレッシャーがかかるとミスを起こしがちなので、いかにプレッシャーを感じずに進めるかが重要そうです。
yulis452は開発はできないものの、情報整理を得意としているので、今回はマニュアルの確認とベンチ結果の考察をお願いしていました。特にマニュアルについては、「このデータについて加点に関係するか?」という聞き方でも適切に加点内容を説明してもらえたこと、当日マニュアルとは別にアプリケーションマニュアルも存在していたことを指摘してくれたことで非常に助かりました。
とはいえ、私自身もそこまで開発の手が早いわけではないですし、ISUCONの参考実装に頻出の言語に慣れていないので、もう1人開発担当がいれば例の凡ミスにもすぐ気がつけたかもしれないなぁ。
予選当日に使用したリポジトリは以下に公開しています。
https://github.com/maruTA-bis5/isucon11-qualify