SODA Engineering Blog
🦊

チームひろし ISUCON13奮闘記 (35,904点 47位)

2023/11/26に公開

結果

最終スコア 35,904点 で、全体で 47位 でした!
予選があったら本選に出場できてない!くやしい!

順位はこちら

https://isucon.net/archives/57993937.html

弊チームのリポジトリはこちら

https://github.com/rinchsan/isucon13-final

チームメンバーのブログはこちら

https://zenn.dev/team_soda/articles/isucon13-final

「チームひろし」

会社のエンジニア2人と3人チームで出場しました。全員初参加でした。
チームスライドにもあるように、ずっとケンカをしていました。
うそです。
和気あいあいとケンカしていました!

やったこと

pprotein がすごい便利だった

すんごい便利でした!

https://github.com/kaz/pprotein

まずはインデックスを貼っていった

pprotein が slp で分析してくれたスロークエリを見ながら、チームみんなで色々と貼っていきました。
10,000点くらいまでは雑にインデックスを貼っていくだけで上がった記憶です。

原因は分かってないんですが、 index out of range で slp が何回かpanicしたときは焦った!

https://github.com/tkuchiki/slp

getReactionsHandler のN+1問題をつぶした

pprotein が出してくれた pprof のフレームグラフを見ると getReactionsHandler のフレームが大きかったので改善に着手しました。
何種類かあった fillXxxResponse という関数でN+1問題がこれでもかと発生していたので、頑張ってGoを書きました。
同じく大きかった getLivecommentsHandler はチームメンバーが潰してくれました。

割とスコアが上がった記憶!

icon の hash をオンメモリキャッシュした

同じく pprof のフレームグラフを見ていると、いたるところで呼ばれている sha256.Sum256 のフレームが割と大きかったので改善に着手しました。
計算されたHash値を sync.Map を使ってオンメモリにキャッシュし、 icon が変更されたときと initialize 時にパージするようにしました。

素振りしていたことが出来てよかった!

getIconHandler で 304 Not Modified を返した

次に pprof に出てきたのは getIconHandler だったので改善に着手しました。
アプリケーションマニュアル に 304 を返せる条件が書いてあったので、それを参考にGoを書きました。

ボトルネックがどんどん移り変わってたのしい!

くやしいポイント

わりと練習した

AWSに4,000円払うくらいは練習しました。

割と練習したつもりだったのに!

3台目が使えなかった

チームメンバーがAppとDBを分けて2台使うように変更してくれて、スコアがぐんと伸びた記憶です。
でも3台目をうまく使うことができませんでした。

練習ではサーバ全台を使えてたのに!

moderateHandler の改善でスコアを上げられなかった

最後のほうに pprof に大きめのフレームで出てきた moderateHandler の改善に着手しました。
すんごい変なSQLが書かれてて読むの大変でしたが、なんとかキレイなクエリへ変更することができました。
が、最終的にはスコアがまったく変わりませんでした。

ボトルネックは変わってたのにスコアが変わらなかった!

ラスト2時間はスコアを上げられなかった

これが一番くやしいかもしれない。

ラスト1時間時点では23位くらいにいたのに!

くやしくないポイント

DNSはわからん

これはわからんすぎて逆にくやしくない!

まとめ

練習で出来たことが本番で出来ないとくやしい。

来年は優勝するぞ!

GitHubで編集を提案
SODA Engineering Blog
SODA Engineering Blog

Discussion