追記: 15位でした
もう何度目か忘れたけど、チーム「カラアゲネイティブ」(Songmu、toricls)でISUON13に参戦。
リポジトリはこちら。
toriclsくんが午前中不在であることがわかっていたので、開始前に集まってGitHubやSlackの会場の相談をしてからスタート。実装はGo。
Songmuさんと問題を読みながら方針を検討。DNSをやるのは面白そうだけど、全然触ったことがないし意図もまだつかめなかったので、まずはmysqldがボトルネックになっていることを確認して、愚直にpt-query-digestでクエリの改善を進めていった。今回はじめてquery-digesterを使ったけど、便利でした。一方でGoアプリケーション自体の改善やアクセスログからのチューニングはまったくやらなかった。
最終的にはPowerDNSに手を入れることはせずに、PowerDNS用のDBとisupipe用のDBを分けるくらいの対応だった。
- isu11: nginx, pdns, isupipe
- isu12: isupipe, redis
- isu13: mysql
という感じ。
あとは思い出せる範囲でざっくりと。ほんとにpt-query-digestの結果を上から潰していくことしかしてない。
- 初期実行: 3,862
- livestream_tagsにインデックスを張る: 4,629
ADMIN PREPARE
が支配的だったのでinterpolateParamsを設定: 4,977- 投げ銭、リアクション数の統計情報の一部をRedis化: 6,335
- 統計情報については他にもまとめて対応できそうな部分も横目に見ていたが、主要ではなさそうだったのでこの時点では後回しにした。
- 予約枠をstarted_at、end_atで見てるところはidベースで見るようにできそうだったので変更: 7,517
- このへんでtoriclsくんが合流。とくに説明せずにキャッチアップしてくれたので助かった。
- Songmuさんがiconsのファイル化をしてくれてだいぶ伸びた。それからtagsのN+1解消、themeのRedis化など: 18,098
- DBとアプリケーションを分ける: 27,976
- goccy/json化、ng_wordsにインデックス、アプリケーションを2台にわける: 34,688
- 統計情報のその他のクエリが支配的になっていたのでRedis化: 36,603
- iconsをredis化: 57,313
- 複数台構成をさらに調整: 74,129
- ユーザ登録時にpdnsutilを呼んでるのを思い出せてよかった。ユーザ登録処理をpdns同居のアプリケーションのみで行うように変更(したはず)
- 最後にダメ押しで getReactionsHandler, getLivecommentsHandler のN+1を解消して2万点ほど上乗せして: 105,751
追試に失敗してなければこれが最終スコア。水責め対応をいくらかでもできればもう少し伸ばせたかもしれないけど、明確にボトルネックなようにも見えなかった&具体的な手を思いつけていなかったので手が出せず。
運営の皆さんおつかれさまでした!!!