6715.jp

2021-08-23

ISUCON11予選に参加した

sekaisekai
ISUCONインフラ参加記

NaruseJunチームでISUCON11予選に出ました。

  • チームメンバー1
  • 結果
    • スコア: 919720
    • 本戦に行ける!🎉🎉
      • ココ最近のNaruseJunチームは追試失敗率が高く2て、2年間本戦に行けていませんでした。悲願達成感があります。

やったこと

  • NaruseJunチームは基本的に個々人が勝手に改善を突っ込んていくスタイル
    • 担当範囲などはあえて決めておらず、全員アプリを触るしインフラもいじる
    • ミドルウェアの設定、アプリコード、デプロイスクリプトが全部入ったリポジトリを使った
      • それぞれローカルで作業、ブランチを切ってリモートにプッシュ、サーバ上でプルしてデプロイ、といった動き
        • ローカルではテストしない(環境まわりでハマるのは時間の無駄なので)
        • 3人で別々に動いているので、声掛けでサーバの占有権を取ってベンチを投げ、それで動作確認する感じ
  • 初動だけは担当作業を決めていた
    • to_hutohu: マニュアル読み込み
    • takashi_trap: リポジトリ、デプロイスクリプト周りの準備
    • sekai67: 環境立ち上げ、計測ツール類準備
      • 細かいツールの導入などはすべてansibleで行う
        • 最初の変更をリポジトリに入れてデプロイするまで 17分
          • 最初の動きをよく詰めておいたので、スムーズに改善へ移れた
  • 計測結果を元に改善ポイントを見つけた
    • 「推測するな、計測せよ」
    • pprof, fgprof, alp, pt-query-digest, netdata を見ていた
      • pprofは基本的にFlame Graphだけ見れば大体わかる
    • pproteinというツールを作って、使った
  • 以下2点の理由から、15時過ぎから新たな改善を入れるのをほぼストップし、追試対策など安全に通過するための戦略に切り替えた(前年の反省)
    • 80万点に到達した15時時点で、次点は10万点代、大多数が10万点未達という状況であったこと
    • 特定の状況下(http2のGOAWAYハンドリングミス3)でベンチマーカーがエラーになり、場合によってはスコアなしになる可能性が残っていたこと
      • 競技中、これがこちら側のミスであるか、運営側のミスであるかを判断できなかった4ため、念の為修正を行う判断に至ったが、結果としては不要だった

こぼれ話

  • 14:30〜15:10まで、コミットするたびに点数が指数関数的に増加した
    • あまりにも上がるし、自分たちの想像以上に上がるので、けっこう驚いていた
      • 運営さんもかなり驚いたたようで、「ベンチマーカーの実装がバグっている可能性がある」として個別で改善方法を確認されました
        • 結果としてバグではなかったのでハッピーエンド
      • 点数が上がるたびにバグの疑念が強まり、ベンチマーカー実装担当の顔がどんどん曇っていったらしい

具体的な改善内容

  • だいたい時系列順
  • 初期スコア: 2000くらい
    • 改善後スコアは必ずしも当該の改善のみが寄与しているわけではないので注意

isu_condition テーブルにインデックスを貼る

/api/trend で返すデータを 0.5 秒ごとに作るようにする

isu_condition テーブルを水平分割 + ログを出さない

  • 時間: 12:20
  • スコア: 42000くらい
  • コミット
  • 根拠
    • alpから。POST ^/api/condition/.+$の合計時間が大きい。GETもそこそこ大きい。
    • pprofのFlame Graphから。getIsuConditions/postIsuConditionsが重い。

iconをDBにつっこむのをやめてファイルに書き出す

微調整

backendを複数台に

getIsuConditionsFromDBの高速化

postIsuCondition バルクインサート + postIsuCondition全受理

nginx調整

getTrend調整

グラフ作成時の取得データ量を減らす

nginx調整

微調整

  • 時間: 16:00〜17:00
  • スコア: 1010000〜1173984(ベストスコア)
  • パラメータをいろいろ調整してた
    • MySQL設定
    • nginx設定
    • getTrend待ち時間

最終

  • 時間: 17:00〜
  • スコア: 988417(最終スコア)
  • http2のGOAWAY問題6でベンチマークがまれに失敗する問題の対応
    • 安全に追試をパスできるように少し性能を落とした

おわり

運営の皆さんありがとうございました。


  1. 全員が今年出題の東京工業大学デジタル創作同好会traPのOBです。
  2. 運営サイドにも定評のある失敗率。
  3. 詳細については予選結果の「不具合について」を参照。
  4. 競技中に質問を行い「ベンチマーカーのバグである」との回答を頂いてはいましたが、チーム内での議論の結果、必ずしもそうとは言えないのではないかという結論になりました。
  5. 次項のFlame Graphと見比べるとgetTrendがすっかり見えなくなっていることがわかります。