ISUCON本戦に出場して 7位でした
はじめに
10月22日(土)にLINEにて行われたISUCON6本戦に@tukuchiki, @hilotter と一緒にチーム「流れ弾」として参加してきました
結果は 7位 (17292点) でした
お題
お題は他の方もブログに書いていますが isuketch という匿名のお絵かきサービスでした
アプリケーションは
- サーバーサイドレンダリングを行うNodeサーバー
- 各言語で実装されたAPIサーバー
という構成でそれらがすべてDocker Composeにて設定されコンテナで動いてるというサービスでした
方針
最初の方針として
- Dockerははがす
- SVGの描画が重いの直そう
- 現在のルーム数が都度DBを参照しているので直そう
- ループクエリがあるので直そう
- Server Sent Event なのでコネクションが枯渇しそうだね
みたいな話をしていました
当日の流れ
当日のコミットログからなにをしたのかを振り返りたいと思います。
10:00 ~
- @tkuchikiがDockerを剥がす
- @hilotter が svg 周りの修正
- 自分が現在の人数の修正
という方針で作業開始
初期ベンチは 10:30頃に4273点
11:30 ~
- 11:30にDockerを剥がすことに成功
- svgをやめるまえにnodeのhttpの優先度をあげる
12:00~
- ルームの参加人数部分をRedisにZADDでセットし現在時刻 - 3sec までの人数を取得するようにする
- ベンチがコケる
- dockerを剥がし前段にnginxを入れたためにnodeをhttp化終了
- svgをgoで返すように修正再開
13:00 ~
- redisのzsetにnanosecでいれていたので結果がおかしくなってたのをsecに変更して通ることを確認
14:00~
- ループクエリの修正を開始
- どうやっても 1ストロークあたりに複数Pointを取得する必要があるのでどうしようかと悩む
- svgの実装がおわるもベンチが メッセージなし 0 で嵌る
- 複数台構成の準備を始める
15:00 ~
- ループクエリの改善に変に嵌ってしまい実装を捨てる
- 描画データはそこまで複雑じゃないのでRedisにキャッシュする方向に方針変更
- Rpushで入れてLRangeで出せば順序ごとに出せるとなったので
16:00~
- 未だにsvg周りで嵌っていたベンチが終了
- 初期データのキャッシュを作り、描画データのキャッシュ化が終了
- ただしベンチでコケる
17:00~
- 再起動チェックをすすめる
- Redisの実装にバグがあるのを発見し修正
- しかしベンチは通らず時間切れ
- 実装をrevert
- DB 1台、 App 4台という構成で最終ベンチ
最終結果
振り返り
- 速くなったのは
- 複数台化、nodeのhttp化、svgをGoで書き出す、現在の人数のキャッシュ化 あたりかなと
- いきなり描画データをキャッシュするという選択は悪手だった
- 100万に目が眩む
- SVGの実装が結構はまっていたので一旦手をとめてループクエリの改善をしてもらった方がよかったかもしれない
- SVGの出力は1secとかでキャッシュするべきだった
- DBの負荷が高いのに他のところの実装を始めてしまった
- ISUCON的アンチパターンをしてしまった
- 並行で実装していたので確認デプロイでぶつかってしまいそこで時間がロストした
- 5台あってIPをポータルから書き換えられたので複数台つかって確認すればよかった
- 振り返えると反省することが無限にでてくるのでこの辺まで
最後に
ISUCON6の運営チームみなさん ありがとうございました
予選/本戦と濃密な時間を過ごせました。
本戦後の懇親会では母校の現役生、先輩 と話すこともでき貴重な時間を過ごすことができました