こんにちは、 @kz_morita です。
今回は 7/23 土曜に行われた isucon12 に参加してきたので振り返りを書いていきます。
今回のISUCONの問題
テーマは、社内ISUCON 用 のマルチテナント SaaS と言うテーマでした。 今回も問題動画のクオリティがむっちゃ高かったので、詳しくは以下を見てください。
技術的にちょっと特殊だったのが、SQLite3 がDBとして使われていたことでした。
マルチテナントで、テナント毎に SQLite の db ファイルが別れていたのが特徴的でした。
終わった後の感想戦や公式の総評でも語れれてましたが、SQLite だと サーバーにファイルが置かれているため、サーバーの分散などが難しくどうするか悩みどころでした。
対応内容の振り返り
初動
チームメンバーと zoom で集合して初動の確認をしました。
いつも通り、環境を整えたりしてました。やったことは以下のような内容です。
- レギュレーションを読む
- サーバーのセットアップ
- ソースコードや設定ファイル系を github にあげる
- 初手ベンチマーク
- kataribe, pt-query-digest などの profiling の準備
- index が明らかに足りてないテーブルに追加
SQLite を剥がしたかった
今回一番特徴的だったのは、テナントごとのデータが SQLite でファイルに書かれていることでした。 SQLite でファイルにある以上サーバーも分けられないし、他のMySQL にあるテーブルとの Join などもできないのでこれを MySQL にしようとチームできめて、メンバーの方を中心に取り組み初めました。
結果的にはここにどハマりしてしまいました。
SQLite のデータを /initialize
の Endpoint で移行し切らなければならなかったのですが 30 秒という制約がありました。データ量が多く純粋に INSERT するだけでは全然 30 秒以内にはおさまらず、goroutine で並列 INSERT したりそもそも INSERT せずに初期化できないかなど色々試したりしていました。
それでもなかなか問題は解決せず気づけば残り時間がかなり少なくなってしまうという感じでした。
終了後の感想戦を聞く限り、一番データ量の多かった player_score
テーブルは最新のデータしか必要なく、古いデータを削除すると データ量が 1/10
程度になるという話でした。
ここに気づけなかったの本当に悔しかったです。アプリケーションのソースコードを見ていて player_score
の row_num
が最新の 1 件しか使ってないことに気づいていたのですが、焦っていたのか初期データから削除できるという発想に至らずデータ量の削減まで至りませんでした。
データ量の問題なら、データ量削減できないかと言う思考にならないとだめでした。元のデータ量のままどうにかして時間を短縮できないかという思考にどハマりしてしまいました。(反省)
SQLite3 .....................
— kz_morita 🐸 (@kz_morita) July 23, 2022
#isucon
最終的に
かなりの時間を使ってしまいましたが、SQLite 剥がし問題は時間内の対応が難しく一旦 player_score
以外のデータを MySQL に移行する決断をしました。
そして、チームメンバーの方が golang の pprof
を回して、SQLite のファイルの lock とってるところがやはり重いと判断し、不要なLockを外し Lock をとる時間を短くするような対応をしてこの辺りで 6500 点くらいのスコアでした。
そしてこのスコアのまま終了時刻を迎えました。
感想
色々と冷静になれば気づけたところが多くかなり悔しい ISUCON でした。 他にチューニングすべき点として、ID の採番を DB に毎回データをインサート (正確には REPLACE INTO) し、AUTO INCREMENT 値を利用していたのですがここも重い箇所で UUID にする案なども浮かんだのですが対応しきれませんでした。
苦戦した SQLite 剥がしもやりきれなかったのはかなり悔しかったです。予選突破しているチームはおそらくうまいこと剥がせてチューニングもしっかりできたチームだと思うので、予選突破を目指すにあたり着手するのは必須だったかなと個人的には思っていますので、ここをクリアできれば・・・と言う思いでいっぱいです。。
よかった点としては、ISUCON予選は何回も参加してるので、初動の動きやデプロイの方法などは確立されてきてやりやすかった点です。この辺り整備してくださったチームメイトの方には感謝です。 今回も以前の職場で一緒に働いていたメンバーの方と一緒にやったのですが年1 で集まる機会になっていてその点もとてもよかったです。
最後に、一緒に戦ってくださったチームメンバーの方ありがとうございました。
そして、毎回面白い問題を出題してくださったりスムーズな進行のために色々と準備してくださった運営のみなさまありがとうございました。 悔しい思いしましたがこれもまた ISUCON の醍醐味かなと思いますし、なにより楽しかったです。
来年もあればぜひチャレンジしていきたいです。
楽しい ISUCON をありがとうございました!