こんにちは!
こちらは TVer Advent Calendar 2023 の2日目の記事です。
TVerのサービスバックエンドのリードエンジニアをやっております内海です🐶!
今年も昨年同様、チーム:パカパカアルパカとして出場してきました。
22位 86,322 パカパカアルパカ
いえーい🎉
やったこと
担当範囲
基本、私はいつもアプリケーションレイヤーばかりみています。
toritori0318氏がインフラをメインに担当。 teraken氏がツール周りと遊撃担当。
開始直後
- AWS上のリソース構築
- レギュレーション、マニュアルの読み合わせ
リソース構築完了後
- 初回ベンチ実行
- 各リソースの負荷状況確認
- マニュアルからトピックの抜き出し
このタイミングではまだやれることが少ないポジションなので、マニュアルから課題になりそうなトピックを抜き出してまとめていました。
また負荷状況はどうみてもMySQLがボトルネックになっていることを確認。
どうせ分散していかなきゃいけないことは明白だったため、一旦1台でいけるところまでチューニングをしてから負荷状況に合わせてサーバーを割り当てる作戦でいくことにしました。
icon対応
マニュアルと読んでいると If-None-Match
ヘッダーに対しての記載が丁寧だったので、まず深追いせずに
- MySQLにデータ保持をしているiconを静的ファイル化
- hash値をredisで保持
If-None-Match
ヘッダーがある場合304を返すように変更
スコア下がる 🤔
PowerDNS
DNS周りの運用は経験がなかったので、問題をみた瞬間にすっぱり切り捨てていた課題だったのですがTTLが0になっていることに気づいて対応をいれました
ここでお昼前5,000弱
モデレートAPIのN+1解消
これでもかってくらいN+1だらけだったので、どこから手をつけるか悩んでましたが
配信品質が上がると視聴者数があがるというマニュアル記載があったため、ブロッカーになりそうなモデレートAPIから着手しました
themeの廃止
ユーザーのダークモード設定が別テーブルで毎回呼ばれていたためusersテーブルに移行し、UserModelで保持できるようにしました
ここでやっと6,801。どのメンバーの対応も微増ではありつつも、着実にスコアは伸びていきました。
作戦会議
そろそろいろんな箇所の課題が見えてきたので一旦ホワイトボードに現在の構成などを書きながら、それぞれの気づきと方向性の共有を行いました
一旦昼過ぎのこのタイミングでは
- Nginxでiconをちゃんと返すようにする
- DNSサーバーとAppサーバーはわけたい
という方針になりました
iconをNginxでキャッシュするように変更
toritori0818氏がNginxでキャッシュできるように対応してくれて 8,796 点
まだここでも1サーバーしか使ってない状況です。
そろそろ分散して課題の深掘りにフェーズ移行していこうと言う話になりました。
MySQLサーバー
2台目のサーバーをMySQL専用サーバーに変更しました
このときは
BenchTarget: Server1 Server1: PowerDNS / App(Go) / redis / Nginx Server2: MySQL Server3:
という状況になりました。
ここでスコアが伸びて 18,181 🎉
ここからはN+1を潰しつつ、それぞれの負荷状況を見て、分散構成を考えていました。
結果的に
サーバー BenchTarget: Server1 Server1: PowerDNS / App1(Go) / Nginx Server2: MySQL Server3: App2(Go) アプリケーション App1: icon / dns系APIのみ App2: その他
という構成でわけました。
Server1にPowerDNSが居たので、できるだけ触らなくていいようユーザー登録APIをServer1:App1で受け付けることにしましたw
また、それだけだと少しApp1が余るので、比較的CPU負荷の少ないiconAPIもApp1に同居させました。
構成を変えてスコアは 27,702 🎉
最後の追い込み
- 出来うるN+1を解消していく
- iconのBinaryをそのままMySQLに書き込んでいたのをやめる
- iconAPIでApp(Go)までたどり着いた場合、原則的にicon未設定者と断定してfallbackImageを即レスするように
などなどやっていると、めきめきとスコアがあがっていきました💪
午前中にやっていた細々したものが開花してきた感があって、アドレナリンでちゃう感じでした!
感想
ISUCONに出場すると毎年思うのですが、
- 瞬間的な取捨選択の嗅覚
- わからない状況でも前にコケる練習
- Webエンジニアとして足りていない部分の再確認
というなかなか普段の業務では獲得し辛いスキルが磨かれるなぁ。と感じています。
日々の業務でもきっと活きてくるスキルだと思いますので、是非ISUCONに参加してみてはいかがでしょう。
来年(まだあるかわからないですが)、対戦出来ること楽しみにしております 😘
運営のみなさん、参加者のみなさん本当にありがとうございました。今年も最高でした!!!!
ISUCON13の問題や、ベンチマーカーの実装は
こちらで公開してくださっています
後日談
再起動テスト終わって、提出スコア出すためのベンチしてたんですが…
なぁんかベストスコアでないんだよなぁ。と思ってました。
終わってからリポジトリみてみると、マージされてないPullRequestが残ってました😇(ログの出力消したりするくらいのやつ
みなさんも、ちゃんとPRがMergeされてるかは確認しましょう😇