kugi's notebook

やったこと、思ったことなどつらつらと書きます

ISUCON12予選 振り返り

はじめに

7月23日(土)に開催されたISUCON12 予選に参加してきました!

今回はその振り返り記事になります。

0次予選

1回目は気づいたら埋まっており、 2回目はなんとかGitHub連携、Discord連携まで行けたものの、 チーム名を決めておらず、一瞬手が止まってしまい敗退。 そして3回目は寝過ごしてしまい、3回あった予選の参加申し込みは全敗...

追加募集枠で滑り込み、なんとか0次予選は突破しました...。

事前準備

私は今年で2回目の参加で、社会人としては初参戦でした。 メンバーは会社の同期のkoikoiくんとmtsgiくんを誘いました。

ふたりともISUCONは初参加だったので、私が参加したISUCON10での記憶や過去問、資料などを共有して、matsuuさんの公開されているISUCON11予選のAMIを用いて練習会を開きました。

github.com

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のログ活用

などたくさんありますが、同期と一緒に良い経験を積むことができました。 来年もこのチームで参加して、さらに高得点を目指したいと思います!