ISUCON10本選をBestスコア37,501点でFailしました
結果
メンチカツという1人チームで参加しました。
ベストスコアは37,501点でしたが、最終チェックの3回目でFailしました。
最終的な構成
今回の本選はサーバ3台でそれぞれスペックが異なる構成でした。
- 2コア、1G
- 2コア、2G
- 4コア、1G
最終的にはこんな感じの構成にしました。
- DBサーバ(notificationテーブルのみ)
- 未使用
- APP、envoy、DBサーバ(notificationテーブル以外)
競技中に2台目のサーバにApp移したりしましたが、ベンチでFailすることが増えたため泣く泣く2台構成で終えました。
感想戦でサーバ入ってチェックして気づいたのですが、この原因と最終チェックでFailした原因がおそらく同じもので、envoyのLimitNOFILEを設定するの忘れてて、そのまま負荷上がるとenvoyがお亡くなりになってしまっていたのが原因でした。
やったこと(順不同)
SetMaxConnsの増加
初期値が10でしょっぱかったので脳死で増加させました
メイン機を3番目のサーバに変更
メモリあまり使っていなかったので一番コア数が多い3番をメインに
インデックスの設定
slow queryを見て効きそうなIndexを設定し、初期にあったindexで微妙そうなindexを削除
ここらへんはmatsuuさんが予選後にTweetしていたSQLパフォーマンス詳解を本選前日に流し読みしたおかげで結構迷わずに設定できました。
ASCとDESCが混ざったORDER BYは書籍「SQLパフォーマンス詳解」で学んだのでとてもオススメです。公式サイトのクーポン「matsuu」は今も有効だと思います。わいわい。 / “ISUCON10 予選問題の解説と講評 : ISUCON公式Blog” https://t.co/tkrBnc960L
— matsuu (ウー馬場ーイーツ) (@matsuu) September 18, 2020
go-cacheの導入
audience向けのダッシュボードは1秒猶予があったのでgo-cache使ってキャッシュ
この対応でMySQLへの負荷が減りスコアがだいぶ伸びました。
本来はvarnish入れたかったけど、1から導入したことがなかったため本選中はチキってやめました。
DBの分割
DB負荷がずっと高かったので簡単にできそうなnotificationテーブルだけサーバ1に分割して移動
notificationDBサーバのCPU使用率が結果的にそんな高くなかったので、この分け方はリソースの使い方として微妙だったかなーと思いつつ、go-cacheと合わせて3万点超えたのでそのままに
本選中にこの謎分割やってた人他にも居たんだろうか……
チーム数の調整
100付近をうろちょろさせてました。
最終的に100が安定してスコア出せてたので100に。
JOINしまくってるクエリの修正(感想戦)
本選中は余裕なかったので感想戦で。
teamsにbest, latestをフリーズ前と実際のものを突っ込むことで対応しました。
アクセス数が少なめのエントリポイントだったせいかあまりスコアは上がらず。
N+1クエリの修正(感想戦)
あまり重たい場所でもなかったのでスコア影響なし
Webpushの追加(感想戦)
本選中はここだけマニュアルの分量多すぎてネタ感あったのと、1人じゃ対応しきれなさそうだったのでスルー
感想戦で実装したら選手からのアクセスが増えたためかMySQLの負荷が高くなりスコアが下がったので、本選中はやらなくて正解だったかなと思いました。
Varnish導入(感想戦)
使ったことはあったけど実際に自分で1から導入したことがなかったので、こちらも本選中はできませんでした。
実際にサクッとインストールから設定まで出来た上に、いれたらスコアめちゃくちゃ上がったので、ここらへん入れられたら良かったなーと後悔。
本選中ハマったこと
サーバ3でMySQLを立ち上げたままgoのbuild走らせたらめちゃくちゃ時間がかかるというのを数十回繰り返したあとに、リソース不足ということに気づきました。
気づいてからはMySQLをStopさせてからgoのbuild走らせるようにしたら一瞬でbuildできるようになったので、ここらへんは時間的にだいぶ無駄にした感じがあります。
途中で30分くらいサーバ応答しないこともあって、このまま復活せずに終了したらどうしようと思って大分焦りました。
感想
本選参加前は1人だけベストスコア低いまま終わったらどうしようかと思っていたので、フリーズ時点で1位表示になれたのはとても嬉しかったです。
本選中は結構スコアの伸びが良くてある程度出来た感じがあったものの、感想戦で行ったVarnish導入やJOINしまくってるクエリの修正など本選中はチキってできなかったこと結構あったなー思い、これが本選のプレッシャーかと実感しました。
一方で、感想戦で追加で行った対応の中にはスコアが伸びないものが多かったので、本選中は結構クリティカルなところを優先度高く対応出来てスコアを効率よく伸ばせていたっぽかったのでそこら辺は良かったなーと思いました。
個人的には同じ1人チームで本選出場していたtakonomuraさんに、最終スコアで1位とFailという天と地の差を見せつけられたのが悔しいので来年もチャレンジしたいです。