🐕

ISUCON13 初参加 やったことまとめ

2023/12/12に公開

最近転職して、FLINTERSという会社に入社しました。
現在FLINTERSでは会社設立10周年を記念し、全社員で133日間ブログを更新し続けるという企画を実施していて、こちらの記事はその95日目です。

ISUCON13に初参加したので記録を残しておきます。
https://isucon.net/archives/57566481.html

誘われた当初は、アプリの改修がメインっぽいので、ほぼインフラエンジニアな私はあまり力になれなそうだなーと思ったり
入社したてだったり個人的な都合もあり余裕がなく、参加するつもりはなかったのですが。

やんわり断ったのだが...いつのまにか参加する事になっていた...何を言っているのか(略
一緒に仕事してる人も参加してたので、まぁやってみるかとはなったのですが
あんにゃろー許さないぞー😈

ISUCONの勉強方法

まず、何はともあれ本を読む。
https://www.amazon.co.jp/達人が教えるWebパフォーマンスチューニング-〜ISUCONから学ぶ高速化の実践-藤原-俊一郎/dp/4297128462

一通り読んだらprivate-isuや過去問をやる。
https://github.com/catatsuy/private-isu
https://github.com/matsuu/aws-isucon

問題を解く時は、本にも書いてありますが
まずアクセスログとスロークエリの設定をしたうえで、以下の流れを繰り返していきます。

  1. ベンチマーク実行
  2. ログ解析する
  3. 遅いところを改修する
  4. ログローテして再度ベンチマーク実行

ただ本戦だとベンチマークをどの粒度でやるのが良いのか…
実際本戦ではインデックスに関しては一通り貼ってから実行してます。

使用したツール

  • alp
    • 本でも紹介されてるアクセスログの解析ツール。
      kataribeも使ってみましたが、優勝チームが使っていたのでalpにしました。
      alpの方がフレキシブルに使えるが各自少し使い方を覚えなければならず、手軽さならkataribeの方かなという印象です。
      ちなみに正規表現でパスをまとめるオプションがあるのですが、configに書いておくとラクでした。[1]
  • pt-query-digest
    • 本でも紹介されているスロークエリの解析ツール。
      最初alpの作者さんが公開されてるslpにしようと思ったのですが、ログ量が多いと?エラーになって解消方法が分からず断念しました。
      個人的にはslpの方が画面を上下移動しなくていいので使いやすいと思います。
      pt-query-digestの方はクエリがそのまま表示されるので、コピペでEXPLAINしやすいのはメリットかも。
  • DBeaver
    • Macで使えて定評がある(らしい)DBクライアントツール。ER図が自動生成できるので使ってみました。
    • あまり使いこなせてはないです。インデックスが貼られてるカラムが一目で分かるのは良かった。
  • VSCode
    • 言語は無難に利用者が多いGoにしたのですが、GoLandも気になりつつ使い慣れたVSCodeにしました。
    • Remote SSH拡張
      • 部分的にしか使わなかったですが、アプリデプロイ以外はこれでやれば良かったかもなと思ってます。Nginxのデプロイスクリプトとか作ってたけど別にいらんかったと思う。
    • MySQL拡張
      • インデックス貼るのに使用。DBeaverでも設定できるとは思います。
  • htop
    • リソース状況見るのに使用。活用できてたかは微妙です。
    • 本当はNetDataとか使いたかったですが、調べる時間が足りなくて断念しました。
  • pprof
    • 本当は入れたかったのですが、私の知識では入れ方が掴めず今回は断念しました。

ISUCONの準備(技術面)

  • ログ解析ツールの使い方を覚える
    • 勉強方法に書いた通り、これが無いと始まらない(と思う)
  • スクリプトの作成(初期設定、設定お掃除、ログローテ、デプロイ)
    • とりあえず全部Ansibleで作成。
    • コンテナ使うことが多くて利用機会が少ないので、次回は別のツールにしたいかも。
  • インデックスの貼り方を復習
    • 割と短時間で得点に繋がりそうなので準備しておきました。
    • 過去問だとインデックス全然足りないってパターンもあるし、ぱっと見大丈夫そうだなってパターンもありました。
  • DBサーバーを切り出す設定を調べておく
    • 初期状態だと中身が同じ独立したサーバーが複数台あるだけなので、1台しか使ってない状態です。
    • サーバーをどう分割するかは状況によると思うのですが、WebAP 1台 / DB 1台はほぼ必ずやるだろうと思ったので、設定箇所を調べておきました。
  • 過去問をやりまくって対処できるように・・・したかった
    • 時間が足りなくて準備で精一杯でした。。

ISUCONの準備(チーム面)

  • 役割分担と当日の流れを決めておく
    • 私と新卒1年目の人で2人チームでした。
    • 私が主にインフラ・DB担当。新卒氏にはアプリを担当してもらい、あとは高度の柔軟性を維持しつつ臨機応変にといった感じで臨みました。
  • 当日までの準備リストを共有して片付ける
  • 作戦会議
    • 時間がなかったので1回だけやりました。
    • 軽くアジェンダ作ってテキパキ進めました。
      • そういえばあまりお互いを知らなかったので自己紹介も時間を取ってやりました。
  • 予行演習
    • 時間がなくてやらずにいたのですが、新卒氏にやりたいと言われたのでやってみました。
    • 1回だけでしたが気持ちを入れ替えて本戦のつもりで、スタートから最初の改修くらいまでやってみました。
      • どうせならとやったことない過去問をチョイスしました。
    • 設定スクリプトのミスを発見するなどして本戦での躓きポイントを減らせたのと、本戦の雰囲気に何となく慣れたので良かったです。

初参加で戸惑ったこと

ふだんの業務とは異なる点で戸惑った事があるので書いておきます。

SSHのユーザー

GitHubに登録してるキーでSSHアクセスできるとは書かれてましたが、誰がアクセスできるとは書かれてなかったので、もしかしたら代表者のみ?という懸念がありました。
結果的には初期状態で全員アクセスできたので杞憂でした。(一応SSHユーザーを全員分作成するスクリプトは作っておいた)
いま考えると予め運営さんに聞いておけば解決したかもしれませんが、競技なのでどこまで聞いていいものなのか。[2]

サーバー構成とアクセス方法

本戦のサーバー構成やベンチマーカーがどうアクセスしてくるのかが、なかなか飲み込めませんでした。
過去問ではスナップショットから同じサーバーを複数台立ち上げて、ベンチマーカーに関してはローカル実行だったり、サーバーのIP指定で実行していました。
どうやら本戦も同様の構成で、ベンチマーカーはポータルからIP指定で実行するらしいという事を、徐々に理解しました。

ふだん業務で扱うシステムは最初からサーバーの役割は分かれていますし、IPでアクセスすることはなく名前解決したLBに対してアクセスし、配下のサーバーに届く事が多いです。
過去問だから便宜上こうなっているのか、ISUCON自体そういうものか分からずにいました。

当日の流れと結果

  • ISUCONポータルからCloudFormationテンプレをDLして環境作成開始
  • 新卒氏はマニュアルを読み始める
  • サーバーにSSHしてアプリのコードをGitHubにUP
  • SSH Configを作成
  • 初期設定スクリプト実行
  • ISUCONポータルから初回のベンチマークを流す 3,441点
  • ログ解析ツールの結果を見ながら新卒氏と会話
  • インデックスがほとんど設定されてなかったので、インデックスを一通り貼る
    • 愚直に各Tableをコードから検索してクエリ確認して貼っていった
  • ベンチマーク実行 7,240点
  • 新卒氏はアプリのコードを修正していく
  • DBサーバーとWebAPサーバーを分ける
    • ひとまずDNSのDBはそのまま残し、アプリのDBだけ別サーバーに(DNS分からんのでそのままにしたら結果的にそうなった)
  • ベンチマーク実行 10,485点
  • APサーバーを2台構成にしてみる
    • 1台空いてたし、動画配信サーバーって重そうな気がするという安易な考え。いま考えると怪しい。監視ツールで可視化したい
    • Nginxでロードバランスの設定をしてみる。セッション維持する必要があるかもしれないので、ひとまずip-hashで分散させてみたが、ほぼ点数変わらず
    • 後から考えてみるとベンチマーカーは単一IPからアクセスしてくるのではと思ったが、後述のトラブルにより変更する時間がなく
    • この辺からベンチマーカー実行時に名前解決のエラーが出始める。マニュアルで、失敗する場合は初期化せよとあったのでやってみたら解消はした
  • 修正したアプリをデプロイする
    • 先述のNginxで点数上がらない理由がまだ分からなかったので一旦保留して、次は新卒氏に修正してもらったアプリをデプロイ
    • ここで前述の名前解決のエラーがまた起きる
    • 初期化とかログローテとかベンチマーカー再実行を新卒氏にお願いする
  • DNS水責めについて知識が乏しいのでChatGPT君と相談してみる
  • 初期化したけど前述の名前解決エラーが解消しない
    • DNS関係は良くも悪くも変えていないし、失敗する事があるようにも読めるし、しかし解消できないし…
      DNSに関しては準備も足りなかったので時間がどんどん過ぎていきました。
  • 1台サーバーを切り捨てる
    • 終了間際になって、\どうせ直せないなら1台捨てればいいのでは?/ となる
    • 元々WebAPサーバーとして使用していた1台を切り捨て、Nginxで振り分けようとして遊んでたサーバーをWebAPサーバーとして使用するように修正
    • これが間に合ったようで最終得点は9,999点でした。

振り返り

ISUCONは名前解決せずIPでアクセスするものだと割り切っていたし、DNSについては全然勉強してなく対処できなかったですね。。(業務だとRoute 53とかだし)
結果、新卒氏が修正したコードで改善するかどうかも試せませんでした。
当時のAMIは残してるので原因はいつか調べようと思います。

今回、初回ということもあり愚直にやることを意識しました。
例えば最低限ツールは調べたけど、それ以外の勉強や準備になるべく時間を割きました。
改善箇所も、できる事を着実にやりました。
最終結果はトラブル解決できず全然でしたが、序盤では順位も一時的に20位くらいに入りました。

つぎ参加するときはインフラの練度を上げて、アプリの改修にも入れるようにしたいなぁ

脚注
  1. kataribeでも同様の設定はできるようです ↩︎

  2. 業務では認識違いは事故の元なのでやめようね ↩︎

Discussion