ISUCON9予選1日目にチーム「いんふらえんじにあー as Code」で参加して初日3位で本戦出場決定しました #isucon

チーム「いんふらえんじにあー as Code」で参加して初日3位で本戦出場決定しました! 何年ぶりかの本戦!嬉しい!

メンバーはいつもの @matsuu @ishikawa84g @netmarkjp の3人で、 役割分担はこれまたいつも通りこんな感じでした。

  • @matsuu バリバリ実装する前衛
  • @ishikawa84g レギュレーションやコードやログやDiscordを見る情報官
  • @netmarkjp 司令塔

最終スコアは26,000ちょい。今回はUbuntuだったのでSELinuxは使わず、 AppArmorのエラーが出てたのでAppArmorの調整をしました。

我々はメンバーは同じでもチーム名は毎回変えていました(都合によりメンバーが違う年もありました)。 実は今回のチーム名にある「いんふらえんじにあー」はISUCON1で賞金を獲得した時のチーム名でした。 縁起がいいですね。

事前準備で↓のメモを作成しておき、本番はしっかりやりました。

当日最初にやることリスト

  1. レギュレーションを改めてよく読む
  2. 当日ガイドをよく読む
  3. アプリを理解する
  • ユーザからみた仕様
    • 画面を見て概要を把握する
  • システム仕様
    • エンドポイント一覧を作る
    • 構造体 / メソッドにコメントを書く(GoDoc / PyDoc)
      • 処理の概要
      • フィールドの意味
    • DBのテーブルを把握
      • mysqldump --no-data
  1. 計測環境を作ってベンチを流してみる
    • ツール準備
    • kataribe
    • mysqltuner
    • pt-query-digest
    • top
    • dstat
  • ログ出力設定
    • Nginxのrequest_time
    • MySQLのslow query log
  • アクセス傾向を見て納得する
  1. どう作り変えるといいか考える

なにをどう実装したかは @matsuu が書いてくれると思うので、 わたしは自分が意識したことを2つ紹介します。

意識したこと1: 事前準備

Alibaba Cloudでインスタンスを起動して過去問を解きました( @matsuu が )。 Timezoneを確認したり、 localhostがIPv6をListenしていないからRedisをインストールしても自動起動しなかったりという挙動をあらかじめ把握することができました。

情報共有のSlack、情報蓄積のScrapbox、作業環境セットアップのAnsible Playbookやsshrcを準備しておいたので大変スムーズでした。 このあたりの段取りは慣れたものですが、 いろいろ試してみたいので、できるだけ毎年違うツールを使うようにしています。 (うろおぼえだけど、去年は情報蓄積はNotion、作業環境セットアップはItamaeだったと思います)

あとは練習しました。 自分のメインのスキルセットはPythonとGoで、 今回はGoでいこうと事前に決めていました。 ただコードを読むのはPythonのほうが楽な場合もあるので、ISUCON中はPython実装とGo実装を両方読んでました。

また直前にやった社内ISUCONも、とてもいい練習になりました。

意識したこと2: 稼働/工数の采配

ISUCONは短い時間でいろいろやりきらないといけないので、 稼働/工数をかけるポイントとタイミングの取捨選択は気をつけています。

  • 諦めるポイント(この実装方法はもうやめよう)
  • 諦めないポイント(このエンドポイントの攻略は不可避だからここはこだわろう)
  • 休むポイント(食事 / おやつ / トイレ)
  • 必須イベント(最初に焦らずコードとレギュレーションを読み込む / 時間の余裕をもって再起動試験する)

結果として今回はうまくハマりまして、 @matsuu の手の速さと、 @ishikawa84g の情報収集力のおかげでとてもスムーズでした。

今回は特にアプリが大きく複雑で、外部APIの仕様をきちんと把握しておく必要がありましたが、 @ishikawa84g がコードとドキュメントを読み込んで・実際に画面を動かして確認してくれたおかげで、 ステータスの遷移をきちんと把握できていたので、 自信を持ってキャッシュ実装をすすめることができました。

まとめ

今回のアプリ / ベンチだと、 地道に切り分けて改善していくと16000くらいかなと思います。

我々の場合は、そこで立ち止まってアクセスログやプロファイリング結果や負荷の傾向をよく見たことで、 /users/transactions.json 内の外部APIとのやりとりがジャンプアップのポイントだと気づけました。 気づけたときに外部APIのdocumentedな挙動がすぐに把握できたので、 スムーズにチューニングして26000までスコアを伸ばせました。

詰まったときに基本に立ち返るのが大事だなと改めて感じました。

本戦に備えて準備して、体調を整えてがんばります。

Event 

See also