ISUCON12予選 振り返り
はじめに
7月23日(土)に開催されたISUCON12 予選に参加してきました!
今回はその振り返り記事になります。
0次予選
1回目は気づいたら埋まっており、 2回目はなんとかGitHub連携、Discord連携まで行けたものの、 チーム名を決めておらず、一瞬手が止まってしまい敗退。 そして3回目は寝過ごしてしまい、3回あった予選の参加申し込みは全敗...
ISUCON12 予選参加応募にお申し込みいただいた皆さん、ありがとうございました!🚀
— ISUCON公式 (@isucon_official) 2022年6月11日
各回の申し込み状況を確認したところ
・第一期 220枠 2:44
・第二期 215枠 1:10
・第三期 215枠 18:52
となり、一般応募650枠が22分48秒で埋まりました。参加者の皆さんにはDiscordにて連絡をいたします。 #isucon
追加募集枠で滑り込み、なんとか0次予選は突破しました...。
事前準備
私は今年で2回目の参加で、社会人としては初参戦でした。 メンバーは会社の同期のkoikoiくんとmtsgiくんを誘いました。
ふたりともISUCONは初参加だったので、私が参加したISUCON10での記憶や過去問、資料などを共有して、matsuuさんの公開されているISUCON11予選のAMIを用いて練習会を開きました。
my.cnf
を用意してMySQLのslow query logを吐き出す方法などを学びました。
[mysqld] slow_query_log = 1 # ログファイルに吐き出す設定 slow_query_log_file = /var/log/mysql/slow.log # # テーブル(mysql.slow_log)に吐き出す設定 log_output = FILE long_query_time = 0.1 log_queries_not_using_indexes = 1
本番でも使用したmy.cnf
予選当日の様子
使用言語は3人とも使ったことのあるPythonを選びました。
事前に一度3人で練習していたので、午前中のうちに環境構築を終え、 お昼を食べて本格的にログの解析や改善できる部分を探しに行きました。
mtsgiくんがdeploy.shを用意してくれてめちゃくちゃ助かりました!
情報の共有
練習会ではNotionを使って情報共有をしていたため、 競技中も気付きメモを用意して、解析結果などを共有しました。
行った改善
解析結果をもとに、koikoiくんとmtsgiくんはindexを追加できそうなところがないかを調べ、 私はキャッシュできそうなところがないかを見ていきました。
visit_historyにindexが追加できそうだったので以下を追加してくれました。
alter table visit_history add index tenant_competition_created_at_idx (tenant_id,competition_id,created_at);
データのキャッシュについては、絶大な効果があったわけではありませんが、
個々のtenant DBへ接続してデータを取得するconnect_to_tenant_db()
が各APIの処理内で呼ばれていたので、
初期データについてはあらかじめキャッシュし、テナント追加毎にリストにもデータを追加するように修正しました。
(5c74983
)
まとめ
結果としては最終スコア 2000 点で、初期状態のGO実装のスコアを超えることができませんでした...。 ただ、小さな改善や予選会までの練習でログの解析についても学ぶことができたので次回に活かしていきたいです。
やりたかったこととして、
- 一意IDの割り振りテーブルの改善
- サーバーの分散(DBとアプリケーション)
- nginxのログ活用
などたくさんありますが、同期と一緒に良い経験を積むことができました。 来年もこのチームで参加して、さらに高得点を目指したいと思います!