ISUCON11 Qual writeup

ISUCON11 Qual writeup

実は毎年参加しているんだけど記事にはしてなかった.
最近ブログも書いてないので書いてみる.

概要

ワイハリマ で参加.最終スコア 26656 でいまいち伸びなかった.
メンバーはいつも通り nhirokinet, tyabuki との3人で,なぜかずっと PHP を使っているチームです(特に執着するような理由はない).
どこかで集まってやろうと思ったけどこんなご時世で緊急事態宣言もでてるので Discord を使ったオンライン参戦. Google docs も少し使った.

リポジトリは以下. github.com

初動

今年はろくに準備もしてなく,中々ひどかった. とりあえず AWS から CloudFormation 流して待ってる間に軽くマニュアルを流し読み. いつも割と禁止事項以外は割と流し読みしてるの内緒.

インスタンスがあがったら初期のままベンチ叩いて 1600 点くらい. php に切り替えてもらうと 1000 点未満になって草生えた. ここからリポジトリソースコードもってきたり, kataribe 入れたりそういう足回り的なことを自分はやっていた.

序盤〜中盤

POST /api/isu/condition/<uuid> がやたらめったら叩かれていて 499 が大量に返っていてまともにリクエスト食えてないんじゃないかという話が上がる. dropProbability はあるが,そもそも php-fpm に流すこと自体無駄なんじゃないか,ということで nginx 側でなんとかしたいと言われる.

upstream と weight 使えばなんとかなるじゃないかと思い自分が担当することに.詳細はリポジトリの nginx.conf をみてください.中々ゴミみたいな実装なんだけど,これが最終的にスコアを変動させる大きな要素となって意外と便利だった.チーム内では "upstream 芸" や "weight 芸" とかいう謎な呼び方をされていた.

久々に nginx 触ったのでやたら時間がかかったが,最終的に9割のリクエストを nginx から 201 を返し,残り1割だけ php-fpm に流すと今まで1000点未満をウロウロしていたのが一気に上がり10000点くらいになる.自分の一番の貢献はここだった.

あとは php 周りの設定みて xdebug 外したり JIT 有効にしてみたりしていた(結局 JIT は効果なさそうだった).

終盤

MySQL 専用機 + POST /api/isu/condition/<uuid> 専用機 + 残りすべて(ここが nginx でベンチのリクエスト受けるとこ)の構成にしてベンチを叩くと,ベンチのリクエストを受けるサーバがやっぱり重い. GET /api/isu/condition が重いのでこれを残り2台のサーバに流したくなる. 流してみると 401 が返ってきて,認証いるじゃん,となる.

ソース読むと session に書いてるだけなので,クッキーに user_id 書いてガバらせる方向で nhirokinet が実装すると分離に成功して 29000点くらいの最高スコアがでる.
もうあんまり時間がないので再起動試験とかやったあと weight 芸という名の POST /api/isu/condition/<uuid> の振り分ける割合を弄ってベンチ流して良い値をみつけるテストをやって終了.

まとめ

事前準備が不足していたり, nginx の config がろくにかけなかったりなんだかエンジニアとして終わりだしてる気がした ISUCON だった(ワイの職業ってエンジニアだったよね…?).

一方で今回は,各個人が好き勝手やるんじゃなくて色々ちゃんと議論してそれぞれ役割分担して改善するといったことができたのはチームとしてよかったんじゃないかなと,振り返って思った.ちゃんと復習とかやりたいね,という話をしていつもしてないけど,さすがにそろそろやりたい.

あと今回はさすがに PHP のままで問題ないのかはすごく気になっているので,このあたりはちゃんと検証したい(とはいえ Go や Rust をすらすら書ける自信もないのがなぁ…).

おまけ

チームメンバーの writeup です.

blog.nhiroki.net