isucon11予選に参加して予選敗退したが成長を感じた
August 22, 2021
メンバー
同期のebikenとtocknの3人で参加しました。
去年と同じメンバーです。
Discordで通話しながら進めました。
最終スコアと順位
言語はGoを選択しました。
最終スコアは55684で、598チーム中で65位でした。
ISUCON11 オンライン予選 全てのチームのスコア(参考値)
競技中の最高スコアは49689で、推移は以下のようでした。
やったこと
- 環境構築
- セットアップ
- webappと設定ファイルをgit管理できるようにした
- 事前に準備していたMakefileのセットアップ
- OS、サーバ、DBの各種情報を出力
- 設定ファイルのバックアップ
- 設定ファイルの反映
- アクセスログ、slow queryの出力
- ブランチを指定してデプロイ
- mock apiの停止、再起動 ← 当日追加
- DBのindexの追加
- trendをredisに移設
- iconをファイルに書き出す
- OSとnginxとmysqlの設定のチューニング
- authのキャッシュ
- サーバ構成を変更
- pprofの追加
- isu_association_configのキャッシュ
- ログの出力を停止
気づいたけど、やれなかったこと
PRが作成されたがmergeできなかったものたち
- condition levelのvirtual columnの追加
- condition postの非同期化
- 不要なトランザクションの削除
去年より成長した点
去年
- すべてmasterにpushしていたので、revertが多かった
- 設定ファイルのチューニングを「なんとなく良さげなもの」で適当にしてしまった
- 途中に色んな変更を入れてしまいfailして、解決に時間がかかった
- 最後のベンチに失敗して、最終スコアが0で終わった
今年
- ブランチごとのデプロイが可能なので、revertがなくPR履歴が綺麗で変更の把握が容易だった
- masterは常に最高スコアがでる状態で維持でき、スコアを残して終われた
- 計測結果の出力が容易だったので、都度ボトルネックの特定ができ優先順位も判断できた
- アプリケーションの特徴を理解して、設定のチューニングができた
改善点
- コネクションの状態を容易に計測できるようにする
- 生のログの出力が容易にできるようにする
- 特にボトルネックになりやすい設定ファイルの知識を更につける
- 最後の1時間でライブラリの変更や、言語のバージョンアップをして取れるスコアを取りきる
反省
「condition levelのvirtual columnの追加」について、init.sqlのINSERTにカラムの指定がないため、カラムを追加すると「カラムと値の数が違う」というエラーでinitializeに失敗しました。init.sqlがgithub repositoryになかったため、アプリケーションのコードのINSERTを確認してしまい原因の特定に時間がかかってしまいました。これは早い段階で生のログを見るべきでした。
また、mergeできなかったPRが残ったので早い段階で相談をしたり、相談にのったりして協力して確実に1つずつPRをmergeするべきでした。
最後に、connectionの状態が把握できていなかったため、気づいていないボトルネックが残っていたと思います。
感想
今年はベンチが安定していて非常に体験が良かったです。
チームで去年の失敗から改善できた点が多く、改善も進めやすかったです。
個人的にISUCONは3つのステップがあると感じています。
- 計測をしてボトルネックを把握でき、最高スコアが出る状態を維持できる(スコアを残せる)
- 思いついた改善PRがすべてmergeでき、大きなボトルネックがほとんど改善できる ← これができて予選突破が視野にはいる
- サービス内容と採点方法を理解して、ミドルウェアと実装方針の変更ができる
去年は1ができていませんでしたが、今年はできていました。来年は2ができるように改善をしていきます。
スコアが伸びそうなPRが残ったのが本当に心残りなので、来年は残さないようにします。
個人的に出せたPR数が少ないので、仕事で普段使わない言語の実装力を上げることも必要だと感じました。来年は大きなボトルネックの改善PRを2つ以上出します。
メンバーの2人とは一緒に練習したり、準備をして楽しかったです。当日もコミュニケーションが気楽でした。
ebikenとtockn、本当にありがとうございました。