ISUCON13に参加しました(最終スコア6909点)
2023/11/25に開催されたISUCON13に参加しました。(チーム名:gogo511)
最終スコアは6909点で、(多分)351位でした。
事前準備
- メンバー全員ISUCON初参加。とりあえず参加してみてインフラ周りの勉強になったらいいねくらいの感じでした。
- 自分は開催の約3週間前にチームに招待してもらって、そこで初めてISUCONを知りました
- 開催の約2週間前にとーふとふさんが運営するISUCON精進鯖に参加させていただきました。
- 11/13くらいからISUCONの勉強を始めました。ISUCON本、事前講習2022座学、ISUCON初心者向け講習会、private-isu辺りを参考に合計20時間くらい勉強しました。
- 11/23にチームで10:00~18:00通しでprivate-isuをやりました。ここで初めてAWSで環境構築しました。この日はサーバからGitHubにpushできなくて終了。初手ベンチ回したのみでスコア改善できず。本番でのチームの目標は「スコア改善を1回する」。通しの作業はめちゃくちゃ疲れました。
- 個人の目標としてはどんな形で終わってもいいから8時間全力で取り組む。
当日やったこと
- 10:09
- 当日マニュアルに沿ってポータル上からAWS CloudFormationのテンプレをダウンロードして、スタックの作成まで完了。
- 10:29
- サーバ構築したメンバーの端末からサーバへSSH接続。検証用のコマンドを実行して正しく起動していることを確認。
- 10:47
- 他のメンバーの端末からサーバへSSH接続する方法がわからずまごつく。サーバ構築したメンバーの端末から引き続き操作することに決定。
- 11:01
- 当日マニュアルに沿って
/etc/hosts
を編集。ブラウザからISUPipeにアクセスしてアプリケーションの動作確認完了。
- 当日マニュアルに沿って
- 11:08
- サーバ1でベンチ実行→3690点
- 11:33
- 当日マニュアルの参考実装の切り替え方法に習って、サーバ1をRubyの実装に切り替え。
- サーバ1でベンチ実行→4180点
- 11:51
- サーバ上にGitHub用の秘密鍵と公開鍵を作成。
~/.ssh/config
に設定を追加。
- サーバ上にGitHub用の秘密鍵と公開鍵を作成。
- 12:33
- リポジトリにサーバの公開鍵を追加。サーバ上からGitHubに接続できることを確認。
.gitignore
に不要そうなファイルを追加しようとする→けど各人の端末で全てのファイルを確認したいからwebapp
配下全部アップでいいんじゃない?→webapp
配下全部git addしたら動かなくなったのでctrl + Cでやめた→pushできることの確認としてwebapp/ruby
だけアップした。
- 13:15
- 45分間の昼休憩。メンバー全員作業中止。
- 13:47
- サーバ1でベンチ実行中にtopコマンドを実行(ベンチのスコアは4003点)。mysqlがボトルネックになっていることを確認。
- 14:19
/etc/mysql/mysql.conf.d/mysqld.cnf
を編集してスロークエリログの設定(long_query_timeを0に変更)。- MySQLを再起動してスロークエリログの設定が反映されていることを確認。
- 14:23
pt-query-digest
をインストール。
- 14:40
- サーバ1でベンチ実行→
pt-query-digest
でログ解析 - 最上位の
SELECT livestream_tags
を改善していく。
- サーバ1でベンチ実行→
- 14:43
SHOW CREATE TABLE
でlivestream_tags
テーブルの情報を確認。
- 14:58
- 該当のクエリを
EXPLAIN
してみた。EXPLAIN
結果をChat GPTに投げた。
- 該当のクエリを
- 15:05
livestream_tags
テーブルのlivestream_id
カラムにindexを貼った。- サーバ1でベンチ実行→5538点
- 15:14
pt-query-digest
を再度実行して改善できてることを確認。- ログローテーションし忘れたが、
pt-query-digest
の結果を見る限り平気そうだったので以降もログローテしないで進めた。
- 15:43
pt-query-digest
の結果で最上位になったSELECT icons
を改善していく。SHOW CREATE TABLE
でicons
テーブルの情報を確認。- 該当クエリを
EXPLAIN
。結果をChat GPTに投げた。 icons
テーブルのuser_id
カラムにindexを貼った。- サーバ1でベンチ実行→6505点
- 15:49
pt-query-digest
を再度実行して改善できてることを確認。
- 15:57
- 試しに何もいじってないサーバ3でベンチ実行→3447点。
- サーバ1で良い点出てるし、他のサーバはよくわからないからノータッチでいいやと判断。
- 16:21
- スロークエリログの設定を元に戻した。
- サーバ1でベンチ実行→7150点
- 16:33
pt-query-digest
の結果で現在最上位のクエリをEXPLAIN
した。
- 16:42
SHOW CREATE TABLE
でlivecomments
テーブルの情報を確認。- EXPLAIN結果とテーブル情報をみてもよくわからないので諦めた。
- 16:58
- 全サーバでベンチ実行→サーバ1:6660点、サーバ2:3460点、サーバ3:3519点
- 上記を最終スコアにすることにして、のんびり雑談。
- 17:49
- 当日マニュアルの「追試」を読んで、やっぱりサーバ2と3もスコア上げた方が良くない?となる。
- サーバ1で行った2つの改善をサーバ2と3にも適用
- 全サーバでベンチ実行→サーバ1:6909点、サーバ2:6699点、サーバ3:6516点
- 最終スコア:6909点
感想・謝辞
感想
- チームとしては2回スコア改善ができたので良かった。環境構築で躓いて1つも改善できないで終わるかなと思っていたので、そこそこ頑張れたと思う。
- 本番はめちゃ疲れた。疲れるまでやり切れたので良かった。
- index貼り以外もやろうとしたが、全然わからんかった...
- AWSの見方全然わからなかった。サーバ3台どう使えば良いのかわからなかった。
- 結局アプリケーションマニュアル全然読まなかったし、最初のアプリの動作確認以外ブラウザからアプリほとんど見なかった。(マニュアルは一番最初に読み込めって言われてたのに..)
- 自分の端末からサーバにSSHできなくて詰まっていたが、結局予行演習でやったときと同じようにサーバ構築した人の端末だけで進めることにした。その後ずっと画面共有しながら進めたのでだいぶ大変だったけど、SSHで詰まってたらそこで終わってたかもしれないので、結果的に良かったのかな。本番の通話しながらの状態だと色んなこと考えちゃって集中するのが難しかった。
- 17:00くらいからもうやること無くなってのんびり雑談していたが、ふとサーバ2と3にも適用した方がよくね?って思えたのは良かった。やったら一瞬だったし。意味があったのはかわからない。
- これまでは漠然と「インフラ周り学習したいな」と思っていたけど、今回ISUCON13に参加したことでやるべきことがだいぶ明確になったのは良かった。今後はとりあえずISUCONの過去問で遊びながらインフラ周りの学習をしていこうと思う。
謝辞
- チームメンバーの皆さん、チームに参加させていただきありがとうございました。ISUCONを知れて良かったです。
- チームNaruseJunの皆さん、優勝おめでとうございます。とーふとふさんにはISUCON精進鯖で色々教えていただき、ありがとうございました。
- 運営やスポンサーの皆さん、ありがとうございました。
追記(2024/1/12)
2024/1/11に行われたISUCON13 公式反省会にも参加しました。
500年ぶりくらいに二次会ってやつに出て帰ろうとしたら「たんおめー!」なかんじで盛り上がった回 (ありがたい) #isucon反省会 pic.twitter.com/GPh19idiEW
— 941 (@941) 2024年1月11日
ISUCON参加→ブログ書く→反省会参加→2次会参加
ISUCON13を完全制覇しました!