ソンブレロ鍋

鍋メモ

ISUCON9 予選に参加した.

ISUCON9 予選に参加した. ISUCON とは,「いい感じにスピードアップコンテスト (Iikanjini Speed Up CONtest) 」 というコンテストで,与えられた Web アプリケーションの処理を高速化するコンテストである.

予選中の最高スコアは 13000~14000 と良かったけれど再起動後のアプリケーション起動がうまくいかず,運営による追試をパスしなかったため予選敗退した.

事前にチームでやったこと

  • 使用する言語を Go に決めていて, Go のパフォーマンス計測ツールである pprof の使い方を学ぶため, ISUCON直前 pprof特訓会に参加した
  • AlibabaCloud ECS(Elastic Computing Service)インスタンスを作る練習
  • ISUCON7 のインスタンスを作ってみる (過去問練習の予定だったが AlibabaCloud アカウントの準備等に時間がかかりインスタンスを作ったところで終了した)
  • ISUCON8 の過去問練習 (先述した pprof を投入する練習としてよく機能した)
  • SSH や hosts などの,ミドルウェアから下のほぼ定型の変更を加えるコードの用意
    • ChatOps ツール / 計測ツール などなどの設定なども含む
      • ChatOps ツールはチームメイトが作ったもの? (詳細を把握していない)
      • kataribe, netdata, phpMyAdmin をメインで使った
  • 当日使う git リポジトリの用意
  • 開発環境の統一
    • VSCode / goimports などの設定
  • 当日集まる場所 (インターネット回線と電源があって座れる場所) の確保

当日にチームでやった,アプリの改善以外のこと

  • 起床
  • 集合
    • 遅刻
  • 昼ごはんの調達
    • 昼ごはんを食べに行ったり買いに行ったりする暇はない
  • 物理的な開発環境の構築
    • 電源・ディスプレイ・ネットワーク接続など
  • コンテスト参加
  • お疲れさま夕食会
  • 解散

アプリについて

まず,高速化する対象の Web アプリケーションの概要を簡単に言うと, isucari という椅子売買サービスだった.ISUCON9 予選の出題者はメルカリなので,だいたいそのままありそうな感じだった. おそらく後日 ISUCON9 公式がリポジトリを公開するはず.

アプリに加えた変更(僕が認識している範囲)

  • pprof を有効にする
  • アプリケーション起動時から変更されない設定ファイル・商品のカテゴリマスタ情報をオンメモリキャッシュする
  • ページングごとの商品一覧取得の SQL がすごく JOIN される
    • この変更の説明はまだ理解していないがとても効いている
  • ユーザー情報の一部 (ID, アカウント名, 出品数?)をキャッシュ (UserSimple をキャッシュする)
  • 支払情報・発送情報の作成を非同期化
  • パスワードハッシュ処理を軽量化
    • bcrypt の繰り返し回数を減らす
    • ハッシュアルゴリズムを bcrypt から MD5 に変更 (この変更は間に合わなかった)
  • このあたりで,CPU/DB ともに余裕が出てきたのでアプリケーションに対するベンチマークのレベルを上げる
    • isucari サービスではキャンペーン開催中という設定を用いてアクセスするユーザーを増やせるという問題設定がある

感想・反省点・学び

pprof 特訓会・土曜日にやった過去問・日曜日の予選当日参加,と非常に楽しく充実した週末を過ごすことができた.チームメイトと運営に感謝.

  • Go の構文・開発体勢が不足していたので,実装力・開発力を上げる
    • GoDoc を読む力
    • Go の構文に対する理解が不足していてコンパイルエラーメッセージでググることが多々発生
  • 再起動試験でハマったので,余裕を持って再起動試験に徹する時間を作る
    • 再起動を含む追試にパスできなかった……
    • 終了 15 分前に再起動でおかしくなることに気付いて非常に焦って直したが,追試をパスしなかった
  • 過去問をやろう
  • 過去問の別言語移植フルスクラッチをやろう
  • MySQL のユーザー名は 16 文字まで
  • AlibabaCloud の日本語メッセージがところどころ難しかったり,唐突に中国語メッセージのみになったりする
    日本語訳が怪しい図
  • その他かなり多くのことを学んだはず