こんにちは。
11/25(土)に開催されたISUCON13にチーム「SMTP」として参加したので、その開催報告です。
チーム
チームメンバーは以下の3人です。
- saiten(21B)
- mehm8128(21B)
- tqk(20B)
3人の頭文字からSMTP(Simple Mail Transfer Protocol)を連想したので、チーム名がSMTPになりました。今回のISUCONではDNSが出たので、結果的に微妙に問題内容のフラグを立てたことになってしまいました。
当日の動き
改善PRに対してそのブランチでベンチを回し、点数が上がったらmainにマージという戦略を取っていました。
点数をちゃんと記録していなかったのでかなり怪しいです。
計測ツールは以下を利用しました。
- netdata
- mysqldumpslow
- pt-query-digest
- pprof
- fgprof
- alp
- htop
- journalctl
- dstat
また、SMTPではほとんどDiscordのチャットでやり取りしていたのですが、以下のURLでほぼ全てのチャット履歴を閲覧できるようにしました。下記のおおまかな流れと一緒に見てもらえればと思います。
エクスポートにはDiscordChatExporterを使い、GitHub Pagesで配信しています。
https://github.com/Tyrrrz/DiscordChatExporter
10:00~ 3486点
競技開始。
主にがサーバーに入って環境構築して、残り2人でドキュメント読んだりコード読んだりしてました。
ログの出力などに思ってたより苦戦してしまい、分担してある程度改善を進めていたとはいえちゃんと改善・ベンチを回せる状態になるまでにかなり時間を使ってしまいました。
大学などで忙しくて当日までまともにチームで準備をする時間が取れなかったのですが、それが効いてしまいました。
11:30~ 4479点
がアイコンの304の処理をスッと書いてPR出したのですが点数が上がらず、一旦放置になりました。
同じタイミングでがlivestream_tags
テーブルにlivestream_id
とtag_id
複合インデックスを貼ったのですが、これは点数が上がりました。
それまでにはalpのログをいい感じにしたり、と一緒に環境構築をしたりしてました。
13:00
昼休憩でボイス会議しました。
アイコンの304のやつが、hash値もDBに保存すればいいのでは?という話になったり、残り時間で各々がどの改善を進めるかという話をしました。
がサーバー分割やhash値のDBへの保存、が重いlivecomment
やreaction
のエンドポイントの改善とDNS周り、が秘伝のたれの流し込みやpprofで重そうだったsearch
周りの改善をするという流れになりました。
13:30 7166点
がInterpolateParams
をtrue
にしてadmin prepareを無効にしました。
14:00 7166点?
がicons
とthemes
のテーブルにindexを貼りました。
14:30 8056点
がNGワードの登録時に、新たにNG対象になった今までのlivecommentを全部削除するやつ高速化しました。GitHub Copilot Chatがいい感じに書いてくれて、いい感じになりました。
16:00 8368点
がlivecommentのGETでtagのN+1があったのを対処しました。
16:30 10083点
がサーバー分割しました。
1台目をアプリ、2台目をDBに割り当てました(DNSは1台目のまま)。
17:30 10481点
が searchLivestreamsHandler
で無駄にクエリを投げていた部分を改善しました。
がいくつかindexを貼ってstatisticsを軽くしました。
18:00
時間ギリギリにログ等を切って競技終了。
その他bulk insertやDNSのttlの設定などもしていたのですが、点数が下がってしまったりfailしたりで入れることができませんでした。
反省点
- アイコンのhashのやつは、
""
(クォーテーション)で囲われているのを終わってから知ったのでそれ直せていればおそらく点数上がったと思います... - 初期状態で全然indexが貼られていなかったので、もっと雑にindexを貼っちゃってよかったかなと思いました
- N+1を改善できる箇所がもっとあったと思うので、慣れとパワーが足りなかったです
- サーバーを1人に任せてしまったのがよくなかったので、もっと上手く自動化などして負担を減らす方法を考えておけばよかったです
感想
mehm8128
あまり準備する時間が取れなくて満足する結果は出せなかったけど、楽しかったです。
開催時期によっては来年から一般枠になりそうですが、来年以降も参加したいです!
saiten
_人人人人人_
> 伏線回収 <
 ̄Y^Y^Y^Y^Y ̄
tqk
楽しかった~
初手で main に push するくらいプログラミング久しぶりだったし、全然準備もできてなかったけど、うまく仕事を回してくれて助かりました!
まとめ
最終的に11,236点(max12,530点)で全体では214位という結果でした。2桁順位いきたいなーと思っていたので、来年またリベンジしたいです。