ISUCON14お疲れさまでした
ISUCON 参加は去年に引き続き2回目でした。自分たちの成長を感じられるという良い機会であったと同時に、力のなさを痛感した日でもありました。逆に力のなさを痛感しなかったらそれは優勝してるってことなんでしょうか?
結果
最終スコア8878で学生23位、全体188位でした!めちゃ良いというわけではないですが、まずまず健闘したのではないか、ぐらいの順位でした。
何をしたか
具体的なスコアと共に語ると良いのかもしれませんが、大したスコアも出してないし、普通にめんどくさいので、書かない方針で行きます。
ちなみに本当に読んで欲しいのはこの後のツール紹介のところなので、ここは読み飛ばしてもらっても良いです。
(自分がやった部分だけ書いています)
初動
@ikura-hamu さんの isu-isu-h を使おうかなと思っていたんですが、Ansible があまりに遅くてイライラしてしまうので、Remote Provisioning Controller というツールを自作して挑みました。isu-isu-h についての詳細は↓に書いてあります。
isu-isu-h と計測周りは大きく変えておらず、ログ取りと適当な exporter だけ入れてよしなにしました。スロークエリとかアクセスログとかの集計には kaz/pprotein を使いました。
インデックスぺたぺた
適当にやりました。語ることはない。
Server-Sent Events (未完)
パッとアクセスログを見ると notification 系がバカみたいに叩かれているのでこれを減らそうと思ったんですが、アプリケーションマニュアルを見ると SSE を実装することでこれを減らせそうに見えます。ChatGPT の力を借りつつ実装してみたんですが、ベンチマーカーが「ライドが長時間マッチングされませんでした」という謎のエラーで落ちてしまって、結局バグを取り切れずに最終ベンチには入っていません。
サーバー分割
サーバー1をDB、サーバー3をアプリ (と Nginx) という構成にしました。サーバー2にアプリを載せる気持ちつもりだったんですが、なぜかループバックアドレス (127.0.0.1) ではDBにアクセスできるのにローカルIPアドレス (192.168.0.11) だとアクセスできなくて、??????となっていました。未だに原因は謎です。サーバー3にしたら上手く行ったので、耐え。
getLatestRideStatus のキャッシュ (未完)
単純な GET クエリですがかなりの回数呼ばれているので雑に motoki317/sc でキャッシュしました。それ自体はかなり上手く行ったんですが、高速化されてステータスが高速に変わりすぎた結果、notification の取得が追いつかなくなってクリティカルエラーで落ちるという現象が起きてしまいました。notification の間隔を狭めてもこのエラーが直らず、敗北。
...と見てみると、未完のものが多すぎる、、、実装力が足りないと申す
Remote Provisioning Controller
isu-isu-h を魔改造した結果もはや原型をあんまり留めていないツールです。とはいっても大きく変わったのは Ansible が全部シェルスクリプトになったところで、あとデプロイ用の WebUI を生やしたりもしていました。
良かったところ
- 初動が爆速
- デプロイが超簡単 (WebUIからチームメンバー誰でもデプロイできる)
良くなかったところ
- 初動でバグる (不安定) (ボクのシェルスクリプト力が足りない)
- デプロイが遅い (サーバー分割したときに直列でデプロイされるため) (書道も同じく、もっと早くできそう)
来年はもっと洗練させます。たぶん。
追記: リポジトリを公開して欲しそうな声を聴いたので、公開しました。observer 部分は isu-isu-h をほぼパクっているので、@ikura-hamu さんに感謝。
ちなみに WebUI はなんと本質部分が1ファイルに詰まっていて、htmx というライブラリを用いて開発されています。htmx を初めて触ったら思ったより面白かったので、こちらもぜひ。
おわりに
来年は今年よりも良い順位になれるように頑張ります。ぬん!