moratorium08 と akouryy と 僕 kcz の3人でISUCON 8の予選に出場しました。
FetchDecodeExecWriteってチーム名です。3人ともチーム名とか決めるの苦手なので、かなり雑に決まりました。
結果、全体で2位がとれました。わいわい。
isucon.net
練習
練習は、一昨日やりました。ISUCON 7 Qualsをやりました。去年僕は出たはずなんですがすべて忘れていました。
当日
言語は、事前から実質golang一択でした。3人とも経験は無ではないです。
始まってバックアップを適当にとったり、ローカルに同期したりしたあと、HTTPサーバがh2oであることを見つけました。
nginxのつもりで臨んでいたので、まあ悩んだんですが、moratoriumくんの割と軽く強いinsistにより、nginxへの置換を決めました。終わってみれば英断だった気がします。
httpリクエストを直接受けられるのは1stインスタンスだけっぽいので、これでnginxを動かして、加えて1st, 2ndでapp、3rdでmariadbを動かしました。
一応3rdでもappは動いていますが、来るリクエストはinitializeだけです。
某所でやったので、ディスプレイが潤沢に得られて、外部ディスプレイの方でdstatとかtop、mysql slow query log、nginx access logとかをずっと流してました。
競技中はdstatは3rd=dbインスタンスだけidleが0になり、mysql slow query logがやばい感じになっているのがほぼほぼ常だったので、クエリ改善してました。
加えて、ベンチのエラー(減点/fatal)もたびたび出てくるので、journalctlでapp logを眺めて、golang特有のどこで発生したかよくわからなくなったエラーを直したりしました。
akouryyくんがNを1にするやつたくさんやってました。Nを1にすることを2回繰り返すことでN^2が1になったりもするっぽいです。
moratoriumくんが、初期実装でtransaction&retryすべきっぽいのにしてないところを直したりしてました。500が減ったり、期待とstatusが違うことに起因する減点が減ったりしてたっぽいです。*1
ほかにもいろいろやってました。いろいろやってました。
最終的には、sql queryがまあまあ改善された結果、1st, 2ndインスタンスでCPU idleが60、3rdインスタンスでCPU idleが20くらいをウロウロしていた気がします。
僕の超大事な役目は、だれかがgit push origin masterしたあとに、
for i in `seq 1 3`; do ssh isu$i -- 'bash -c "source ~/.bash_profile; source ~/torb/webapp/go/waiwai.sh"'&; done
を実行して、終わったら掛け声をかけることです。
waiwai.shは以下です。
cd /home/isucon/torb/webapp/go git pull origin master make sudo systemctl restart torb.go
そうするとmoratoriumくんがbenchmark enqueueボタンを押してくれます。
そしてdstatを眺め、終了の様子が見られたらベンチマークの結果を眺めます。これがルーチンでした。思い出したようにlogの削除も行いました。
意気込み
Finalがんばるぞい
*1:moransactionとmoratoransaction、どっちのほうがおもしろいとおもいますか