ISUCONに@yunazunoと@nerbaraki_m2とともに,チーム"かまたまうどん"と称して参加してきました.
ISUCONとは"Iikanjini Speed Up Contest"の略で,お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングの大会です.
今年で三回目の大会で,74チーム計210名もの人が参加したようです.
今年からはオンライン予選があったのですが,予選上位20チームに加えて学生枠で3チームが決勝にいけるということでワンチャン決勝いけるのではとか夢見てました.
当日やったこと
10時に予選開始だったのでとりあえず9時に集合して,モニタやラップトップを運んだりして一日戦うための環境を整えてました.
あとは簡単な役割分担などの軽いミーティング.
AMI-IDが確認できたのでまずはインスタンスの起動とsshの設定.このへんは@yunazunoに丸投げでしたw
sshでログインできるようになったら,とりあえず現状把握ということでOSの種類やあがってるプロセスの確認.
memcached入れようと思ってたけど最初から動いてるね〜とか言ってたのでたぶんこの時点ですでに罠にハマってた.
僕らはPythonでやりたかったのでsupervisordの設定を書き換えてベンチをまわしてみる.
スコアは1900くらいでSUCCESSしてたのでとりあえず一安心.
あとは必要なコマンドつっこんだりtop見ながらベンチまわしたり設定ファイルのぞいたりしてた.
この時/usr/my.cnfが空じゃんみたいな話になったのにまぁデフォルトでもしばらくはよしなにやってくれるでしょとか言ってスルーした(マヌケ)
だいたい環境も整って現状把握もできてきたところで,プロファイラ使ったりスロークエリみたりなどしてボトルネックを探しだす.
Markdownの変換を外部プロセスでやってるとか,SELECT * FROM memos WHERE is_private=N ORDER BY created_at DESC, id DESC LIMIT N OFFSET N
が重いとかそんな話をしていた記憶がある.
とりあえずApatch->nginxにして静的ファイルをnginxで処理するようにしたり,Markdown変換をPythonのライブラリに変更したり,user / is_private / created_atにインデックス貼ったりした.
gzipは同一マシン内だし意味無いでしょってことで,スコアが上がらないことも確認した上でOFFにした.
この時点で確かスコアは3600くらいで,折り返しで9位でした.
WebApp側のクエリを改善したりはしたけど,未だにMySQLがボトルネックだよねぇってことでどうするか会議.
contentは編集機能がないからいっそHTML変換してDBに突っ込もう,そして全部メモリにのせてしまおうみたいな話からMongoDB使った実装を作り出す.(MongoDBほぼ未経験なのに)
たぶんここで舵の取り方ミスってなかったらもう少しマシな結果だっだと思う.
MySQLからデータぶっこ抜いてMongoDBにつっこむinitスクリプトも書いて実装を終わらせようと頑張りましたが,後半皆で焦って色々いじったせいでエラーログが見にくかったりして実装自体間に合わずタイムアップ…
正直後半は何も改善されない無駄な努力をしていただけでした.悔しい.
せっかくなのでMongoDB実装終わらしてから解散しようということでバグ取りを続けてなんとか完成させる.テストベンチを回すとMySQL実装の時とスコア変わらなくて絶望した.AMI提出して僕達のISUCONは終わりを迎えたのでした…
感想
前半はうまく連携がとれていたが後半はボロボロだった.どうしてこうなった…
当たり前すぎる話ですが短時間での再実装は難しいですね.やるならもっと早い時間に決め打ちでやらないと間に合わなさそう.
そもそもそんな事やる前に/usr/my.cnfをなんとかするべきでした.あとは横着せずに粛々とクエリの改善やnginxのチューニング,キャッシュの実装なんかをすすめるべきだった.
WebApp自体は@yunazunoがかなり手を加えてくれていたので,MySQLの設定とかちゃんとしてたらそれなりのスコアが出てたのではと思ったり…
色々悔いは残りますが,とにかくとても楽しかったです.8時間あっという間でした.来年は会社の同期でも誘ってまた参加したいです:D
さいごに
何度も言いますがとても楽しかったです.運営の皆様本当にお疲れ様でした.
本戦に出場する皆様は本戦でも頑張ってください!
[追記]
繰り上がりで本戦出場できてしまったみたいです
ISUCON 本戦出場者決定のお知らせ - ISUCON公式Blog