k02というチームでISUCON8予選に参加し、予選を通過することができました。
準備
kyokomi が事前に kibela を導入してくれていたので毎年よく使うコマンドやNginx/MySQLの設定ファイル等を予め追加していました。
当日の会場とディスプレイ等はwaniji が手配してくれたおかげで横並びで作業することができ、最高の環境でした。
当日
なんとか起床に成功し、恵比寿に集合することに成功。
ひとまず全員でレギュレーションの読込み後、サービスの機能一覧を確認しました。
この時点で h2o
と MariaDB
の存在に気がついたのですが、一旦後回しにし、アプリケーション側のチューニングに集中することに。
今回も諸事情でGo実装を選択していましたが、普段の業務では使っていないためRuby実装とGo実装を交互に読みながらソースを確認していました。
ソースリーディング中はkyokomiが出力してくれたER図がとても役に立ちました。
N+1、インデックス追加、Sheetテーブルのキャシュ等を行いましたが、DBのCPU使用率が高すぎてベンチの結果が上がらなくなったため、早々にDBを別サーバに切り出すことにしました。
このあたりからスコアが徐々に伸び始めて10000点くらいになり、10位代をうろうろしていました。
その後いくつかの変更を加えた後にDBのコネクション数を変更してみたところ、30000点を超えて暫定4位を記録しました
が、/admin/api/reports/events/:id/sales
の結果に整合性がない?みたいなエラーが出るようになり、
ベンチーマークの結果がなかなか安定せず、数回に一回だけ成功するガチャ状態に陥ってしまいました。
原因が掴めずここでかなり時間を消費してしまいました...。
この間にシート予約時の場所をランダムではなく、順番に着席させてみたら怒られたりしてゲラゲラ笑ってました。
終盤間際で排他処理が正常にできていないことに気が付き、ベンチマーク結果を安定させることができました。
そのまま終了3分前くらいに、その日の最高得点が出たので終了しました。