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