#ISUCON13 に パカパカアルパカとして参加して22位でフィニッシュでした!(86,322点)

こんにちは!

こちらは TVer Advent Calendar 2023 の2日目の記事です。

TVerのサービスバックエンドのリードエンジニアをやっております内海です🐶!

今年も昨年同様、チーム:パカパカアルパカとして出場してきました。

isucon.net

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の問題や、ベンチマーカーの実装は

github.com

こちらで公開してくださっています

後日談

再起動テスト終わって、提出スコア出すためのベンチしてたんですが…

なぁんかベストスコアでないんだよなぁ。と思ってました。

終わってからリポジトリみてみると、マージされてないPullRequestが残ってました😇(ログの出力消したりするくらいのやつ

みなさんも、ちゃんとPRがMergeされてるかは確認しましょう😇