isucon13 チーム「パカパカアルパカ」で22位入賞しました #isucon
isucon13、去年に引き続きチーム「パカパカアルパカ」として出場しました!
結果は score: 86322
で22位でした!
今年は個人的な準備があまり出来てなかったので去年より自信は無かったのですが そう考えると健闘出来たのかなと思います。
テーマ
ISUPipeというLIVE配信アプリケーション!
コメントにリアクションに投げ銭など、過去実際にサービスとして実装したことのあるようなアプリケーションだったのでテンション上がりました💪
自分のやってたこと
速攻でCloudFormation投入しつつマニュアル読み。
DNS水責め攻撃…!!PowerDNSもどういうものかは知ってましたが実際に利用したことはないのでひどく狼狽してました 😫
まずは自分担当としていつもどおりモニタリング系とデプロイシェル準備。サーバ間通信できるようにssh疎通確認したり、/etc/hosts書いたりしてました。
アプリはアイコン周りはいの一番にどうにかしたほうが良いよね、というのとstatisticsは大変そうだけどやらんとな〜、みたいな見解。
あとはいつも通り実際にベンチ回してログ見ながら重そうなとこをひたすらやってく。
他の2名はアプリRedis化やPowerDNS周りの改善などをひたすらこなしていました。
前半〜お昼すぎまで
以下は自分の作業分。
- livestream tags indexにindex追加
- nginxで静的配信するための設定検証
- プリペアドステートメントOFF
- タグ取得のN+1回避
この辺でベンチマーカーが使えなくなったりしてたので、その間にmysqlやredisを全台から疎通する準備してたり、複数台に対してデプロイするスクリプト書いたり、最終的な全体構成どうするかみたいな相談しつつそのための準備などしてました。
DNS周りは下手にいじるとハマりそうだったのと、他の機能と切り分けたほうがきれいに分散できそうかなというとこで以下の構成で行くことにしました
- APP1: エントリポイント / Nginx / Go App (register / icon) / MySQL(DNS)
- APP2: MySQL(アプリケーション)
- APP3: Go App (register / icon 以外全部) / Redis
最終構成のイメージ以下のような感じ
中盤以降
分散周りの設定を進めながら、ALPとpt-query-digestの結果を回して実直にボトルネック潰していくといい感じにスピードアップしていきました!
こうなると楽しくなってくるやつですね 😁
- livestream_tagsにindexもう一つ追加
- livecommentsのカバーリングindex追加
- db idle connection増加
- reactionsにindex追加
- reservation_slotsにindex追加
- livestreamsにindex追加
- MySQLパラメータチューニング
終盤、わんこ氏がstatistics周りの改善で60000超え!
その後、何故か静的画像化したselect icon がスローログの上位に戻ってきたのでなんでー?って相談してたら
そもそも取得する必要ないやんってなって改善したら80000超え!!
このあたりで17:00過ぎてたのであとはログ消しとか再起動チェックとかリスクなさそうなNginxチューニングとかしてたらおおよそ30分前…
ジョブキューのWaitingもあったのであまりチャレンジ出来ないなーと思いながらベンチ実行していくと、何故か実行するたびにスコアが下がっていくという状況に 😇
最終的に、10分前に86000台にもどしてFinish!
お疲れ様でした!!!
雑感
振り返ってみると今回は9割くらいインフラとMySQL見てた感じでした。
ただ、その辺りでハマることなくすんなり複数台構成できたり、デプロイ周りも他2人に意識させずにいい感じに提供できてたので、そこはわりと価値出せたかなと思います。
反省点としては、アプリ見直してみるとまだまだ手を付けられそうなところはありそうだったので
やはりもっと全体的にスピードを上げねばな〜という感じですね。
順位、いつもいいポジションには付けているのでもっと精度を上げてここを天元突破したい…!
まとめ
毎年多数のチーム・人数を捌く運営の方々には本当に頭が下がります🙇♂
今年も本当に楽しかったです!良問ありがとうございました!!
おまけ
スコア推移見れるようになってたのでスクショ貼っておきます。 お昼すぎまでは辛い時間だった様子