ISUCON10予選

今更ながらせっかく予選突破できたので記念に書いておきます。

ISUCON10 の予選にチーム「101010」で参加し、本選出場が決まりました。
メンバーは aru と自分の2人です。

自分はツール、インフラとアプリを少し修正したりしていました。

以下、自分がやったことをざっくりとまとめます。
色々やったような気はするんですが、細々としたものを除いてこうして見ると案外少ない気が?

やったこと

Jenkins + Ansible によるデプロイジョブの作成

チェックアウトしてビルドして rsync してログローテートして restart するやつ。

事前に AWSインスタンスを立てて用意していた Jenkins で、ジョブもリハーサルで使ったものがあるのでほぼそのまま。

使う人の環境に依存せず、ここだけ整備すればいいので便利。

Prometheus + Grafana によるパフォーマンス監視

これもリハーサル時に用意済みなので、設定変更と node_exporter のインストールだけ。
踏み台サーバを経由する必要があるので dynamic port forwarding して socks プロキシで接続。

ぱっと見でベンチマーク実行中の全体の状況がわかるので便利。

f:id:qitoi:20200916021055p:plain

bot の 503 対応

マニュアルに書かれていたので、早いうちに対応。
正規表現が通らずに何度も nginx 再起動してた。

MySQL 8 へのアップデート

降順インデックスがあったので、失敗しても役割変えれば問題ないってことでアップデート。
スコアが下がった & 原因がすぐにはわからそうなのでサーバの役割を入れ替えて切り戻し。

DBの垂直分割

DB サーバの CPU 使用率どうするかなーとアプリケーションを触っていたら estate と chair ほとんど関係ないな、と気付いたので DB を垂直分割することに決定。

コードを極力変更したくなかったので、 chair に関しては app と DB を同居させ、 nginx + estate/app, estate/db, chair/app + chair/db という構成に。
とはいえクエリ投げてる部分が少なかったので app 1台、 DB 2台で素直に分けても良かったかもしれない。

static_gzip

20:50 ごろ、ふと /www/data を見たら index.html がそこそこ大きかったので、必死になって gzip
後からマニュアル見返したらベンチマークのリクエストは API のみ、ってことで意味がなかった。

感想

凄くシンプルなアプリなのに色々対応することがあって、とてもおもしろい課題でした。

自分としては、用意していたツールが便利に使えましたし、やれることをやりきった感がありますし、2回目の参加で予選突破と思ってもなかった結果が出せましたし、とても満足です。

逆に言うと、今のままだとこれ以上はできないだろうなということでもあるので、本選に向けてできることを少しでも増やそうと思います。

最後に、運営の皆様、お疲れさまでした。 本選もよろしくお願いいたします。