ISUCON10予選に参加して敗退しました
9/12(土)に開催されたISUCON10に出場して、予選敗退しました。
ISUCON9に引き続きチームオガヨシで出場しました。
点数は630点で、非常に悔しい結果となりました。
準備
前回のISUCON9で、サーバーに入っての作業に手間取ってしまったので、今回はその練習を中心に行いました。
また、ssh、pull、ライブラリのインストール、再起動を行うだけの簡単なデプロイスクリプトを用意しておきました。
夏期講習を参考にして、はじめの50分でやることをチームで共有しました。
12:20
ssh、サーバーの初期設定、Githubに登録、sqlのdumpなどをしました。その後、参考実装をrubyに切り替え、アプリケーションの動作確認をしました。
12:50
計測にはNew Relicを利用しました。ボトルネックが直感的にわかったので、非常に助かりました。
newrelic_rpmをインストールして、ベンチマークを流しました。New Relicを見ながらボトルネックを確認しました。
開発環境をdockerで作ろうとしましたが、うまくいかず、挫折しました。
DBを見やすくするためにTablePlusの設定をしました。
14:30ごろ
ベンチマークを回してみると、/api/estate/searchと/api/chair/searchに時間がかかっていました。メンバーは改善のためにindexを貼ったりしてくれていました。
それと並行して、DBを分離することにしました。分離自体はスムーズに進み、Web1台、DB1台の構成になりました。
DBを分離したら/api/estate/nazotteの割合が大きくなりました。topを確認すると、mysqlのcpu使用率が高い状態でした。
15:30ごろ
マニュアルに書いてあったので、botをnginxで弾くようにしました。
logを見てもbotのアクセスはたいして来てはいなかったのですが、後々効いてくるだろうと思い、実装しました。
実装はif文で個別に503を返すようにしました。mapを使って書くときれいに書けたようです。
17:00
パフォーマンスが上がるのではないかと思い、mysql8へののバージョンアップに着手しました。
(今考えてみると、もっと明確な理由をもってやるべきでした...
ベンチを流してみると、点数が下がりました。
設定の問題だと思い、見直しましたが、とくには変わりませんでした。
その間、チームでは/api/estate/nazotteの改善を中心にやってもらっていました。
19:30
mysql8でパフォーマンスがもどらなかったため、mysqlを5.7に戻しました。
5.7に戻したあとも設定をチューニングしました。
しかし、大して点数は代わりませんでした。
20:30
New Relicを除外しました。
しかし、大して点数はあがりませんでした。
21:00
終了
ふりかえり
開始直後の作業やDBサーバーの分離などはスムーズにできました。デプロイのスクリプトを用意しておいたこともよかったです。New Relicのおかげでボトルネックはわかりやすかったと思います。
他の出場者のブログを読んでいると、SQLをコツコツと直し続けていた印象がありました。思えば、DBの分離、bot対策、mysql8よりも先にSQLの改善に集中すべきでした。
SQLの知識は不足しているので、しっかりと勉強したいと思いました。また、日々の業務で使う技術を深堀り、本質を理解することを意識したいと改めて思いました。