ISUCON12 予選の記録

2022-07-24
ISUCON
ISUCON12

ISUCON12開催決定!予選本選ともにオンライン開催!&参加チームとメンバーリスト #isucon : ISUCON公式Blog

というわけで、去る 2022/7/23(土)に行われた ISUCON12予選の記録です。

@mettoboshi, @gennei, @hanhan1978 のチーム「UFT」で挑みました!

最終結果

ISUCON12 オンライン予選 全てのチームのスコア(参考値) : ISUCON公式Blog

6745149位という結果でした。いやぁ、失格にならずにスコアは出せました。
予選突破はなりませんでしたが、初参加が2名のチームで、ここまで健闘できたのは良かったです。

チーム構成

  • @gennei アプリケーション担当
  • @mettoboshi アプリケーション副担当
  • @hanhan1978 インフラ担当

当日のログ

  • 10:00 競技開始

  • 10:20 各サーバーへの最低限の bash_profile 設定等を終わらせて、ソースコードをリポジトリにプッシュ。

  • 時間不明 alp, pt-query-digest, htop やらをインストールして、計測と解析をかんたんに実施できるシェルなどを準備完了。

  • 時間不明 mysql のテーブルに、ある程度のインデックスを追加したことで、MySQL の CPU 負荷が優位に下がったことを確認。

  • 12:56 PHP のコンテナ内に、xhprof やら opcache やら apcu やらを追加して、何度でも環境再構築出来るような状態を整えた。

  • 13:39 MySQL サーバーを分離して WEB + DB の2台構成に変更。

  • 14:09 MySQL の設定を変更。この時点で MySQL は常に鼻歌歌ってるくらいの負荷に落ち着いた。

  • 15:00 PHP-FPM のワーカー数を 50 くらいまで上げた。(これは、かなり効果あった)

  • 16:00 preloading の設定 (想定していたが、この時点では効果なし)

  • 17:00 再起動試験に向けて、開発用に入れていたツール類の削除を開始

  • 17:10 xhprof を見るために開けていた SecurityGroup の Port 8080 を削除

  • 17:40 各サーバーの Reboot 試験を実施

感想

今までの練習で、サーバーに直接インストールされた PHP をいじる想定で準備してきたため Docker 環境だったことに少し戸惑ってしまいました。自分は Docker にも慣れているはずなのに、少しアワアワしてしまった。12:56 はかかりすぎて、遅くとも 11:30 までには終わらせておきたかった。

その後は、チームメイトの実装相談を聞きつつ、サーバーのメトリクスを見て、構成変更やミドルウェアの設定変更を実施していった。悔やまれるのは、SQLite のデータを MySQL 化することは、私が引き取ってもよい案件だったということでした。考えてみれば、アプリケーション修正ではなく、作業分割出来るオペレーション作業でした。 @gennei をもっとアプリケーションの理解に専念させるためにも、別個に対応できる部分は、もっと自分が支援すべきだったと思いました。

もちろん、それをやったからと行って、initialize の 30秒間にデータをロードできるようにまで出来たか?と言われると疑問は残りますが、自分のリソースが一番余裕があったので、そこを有効活用すべきだったなと、今になると思います。

ISUCON のたびに反省しきりの私ではあるのですが、今回については結構満足しています。

  1. 計測する
  2. ボトルネックを見つける
  3. 対応する

この基本の流れをチームで上手に行えていました。事前に3回の合同練習をおこなったおかげで、チームワークも良かったです。時間の制約がなければ正しい対応を行えていたであろうチームになれたことは、素晴らしかったと思っています。


いやでも、悔しいね!!!(笑) SQLite をインフラ側からでも、なんとかねじ伏せる方法はなかったものか?と悶々としています。tmpfs を使うと一挙にアプリケーションが CPU でサチるようになったので、ここをなんとかしたかった!しかし、自分の引き出しには、すぐにこれを解決する方法は入ってなかったでした。

というわけで、しばらくは他の人の感想ブログや、予選突破ブログは読まずに、この宿題を自分の力でやってみようと思います。

@gennei, @mettoboshi ありがとうございました!来年リベンジしましょう!