guri3.dev
Published on

ISUCON13に参加した

香る明治屋ガロファロというチームで ISUCON13 に参加しました。最終スコアは 19,811 でした。

事前準備

今年はちゃんと準備して出るぞ、ということで9月後半くらいから土曜日の午前を練習タイムに設定して色々と準備をしていました。2人チームだったので、予定が合うときは private-isu を使って実際に手を動かしたり、1人の時は過去問を解きつつ本番で使うツールの選定をしたり、頻出の改善方法を Issue にまとめてシュッと参照できるように準備するいうことをしました。

また、本番2日前の祝日に本番を想定しての素振りを行いました。ISUCON12 本選の問題を使って当日のオペレーションや役割分担を整理していきました。

やることリスト

また、競技中に頻繁に行うオペレーションについてはスクリプトと Makefile を用意しました。特に「デプロイ -> ログローテート -> (ベンチマーク) -> ログの集計・Slackへの通知」という流れがかなり高速に回せるようになったので、これはちゃんと用意していって本当によかったなと思いました。

Makefile
help:
	cat Makefile

init:
	./scripts/init.sh

install:
	./scripts/install.sh

log-rotate:
	./scripts/log-rotate.sh

deploy:
	./scripts/deploy.sh

pre-bench: deploy log-rotate

notify:
	./scripts/notify.sh

利用ツール

ツールは以下のものを利用しました。

  • alp
    • アクセスログ解析用
  • pt-query-digest
    • スロークエリログ解析用
  • notify_slack
    • ログ集計結果のSlack通知
  • top
    • ベンチマーク実行中のマシンの状態を確認

当日

細かい時間・スコアは記録出来ていないので流れを思い出しながら自分がやったこと。

  • 1時間かからないくらいで事前にやろうとしていた準備が一通り終わった
  • MySQL の CPU 使用率が高くてスロークエリログにも重いクエリが見つかったので index を貼っていった
  • よく見る Admin Prepare とかがでてきたので直した
  • MySQL がかなり重いのでもう DB 分割しちゃっていいかもねということで2台目のインスタンスの利用準備
    • その後 kubosuke がシュッとアプリケーションのDBの参照を変更してくれた
  • MySQL 引き続き重いので、スロークエリログみて N+1 の特定・修正
  • DNS の MySQL が1台目のインスタンスの足引っ張ってそう?ということで3台目への移行を試みる
    • 大分沼った上に実装しきれなくて諦める
    • register でサブドメインを登録していることに気付いていなかった
      • あとからみたらそれはそうという感じで悔しすぎた
  • まだ N+1 で解消できそうなところがあったので直そうとしたが時間が足りずに中途半端に終わる
  • スロークエリログとかアクセスログを切る、MySQL のパラメータを秘伝のタレで調整

初動の動きがかなりスムーズで何度かチーム名を YouTube に出現させることができてワイワイしていました。

反省

  • DNS の移行実装に時間を掛け過ぎた。移行できたらスコアがグッと上がったかもしれないけど、N+1 とかも残っていたのでできることを先にやるべきだった
  • 事前準備してたスクリプト群が複数台構成に対応しておらず、各インスタンスでのオペレーションが存在する状態になったので改善の余地がありそう
  • CPU 使用率などのモニタリングやエンドポイント内部の細かい処理の時間を効率的に見る方法を特に用意していなかったので手段を用意しておきたい
  • 30分で最後の調整に入ろうと話していたのにオーバーした。DNS の方のスロークエリログを切るのを多分忘れていたので、時間の余裕大事

感想

事前に練習していたところは思い通りに進めることができたので、次はその先の改善にどんどん手を出せるようになりたい。対戦ありがとうございました!!!