ISUCON3 予選の記録
チームNoderとして@yosuke_furukawaさんと@hakoberaさんと一緒にISUCON3に参戦してきた。ISUCON初参戦。なんとか1日目の9位に食い込んで本選にもでれるっぽい(まだ暫定だけど)。
以下大体の記録。
序盤
前日までにLingerでチャットルーム、GitHubでプライベートリポジトリつくって当日に臨む。当日はyosuke_furukawaさんが勤務するDeNAのオフィスをお借りして3人で集まって作業した。
まず最初にAWSの設定をhakoberaさんにお願いして、sshでログインできるようにしてもらう。僕とyosuke_furukawaさんはAWSに不慣れだったので二人だったらここでだいぶ時間かかった気がする。
とりあえずアプリをgitで管理してローカルで作業できるようにしたりアプリの構成とかベンチマークツールの使い方を把握するなどの雑務をやって、Node.jsのアプリを起動する。
しかし、ベンチマーク取ってみると、何も触ってないのにMemcachedまわりでエラー吐いたりtmpファイル作ろうとするところでエラー吐いたりしてまともにベンチとれずw
Node.js実装についてはsupervisordではなくstandaloneで動かすとtmpfile()が $HOME/tmp にテンポラリファイル作ろうとするため、コンソールから直接npm start等で起動した場合はそのようなフォルダがなくエラーとなる問題が1日目のAMIにありました。この点でハマってしまった方、申し訳ありません。
まさに罠だったw(Memcachedのエラーがなんだったのかは今となっては定かではない)
僕とyosuke_furukawaさんでなんとかまともにベンチとれるようにアプリを直す間にhakoberaさんがNginxとかRedisをたててもらったりしてなんとか戦えそうなところまで持っていく。
中盤
パッと見て問題ありそうな、Markdownを外部プロセスで変換してるところを直したり、インデックスが必要そうなカラムにインデックス張ったり、Nginxで静的ファイルを返すようにしたりでお昼すぎくらいにスコアは2000くらい。
そんでとりあえずログ取ってどこをチューニングするか決めてやろうってことで、hakoberaさんにログとってもらって、/
と/recent/:page
が遅いってことがわかったんでここをメインにチューニングする方針に。
その部分のアプリの実装みたらmemosのレコードを100件引いてきてそのユーザーを引くのに100件クエリを発行してた(いわゆるN+1問題)のでここはすぐ速くできそうだなと思って手をつける。
IN
で一気に引いてくればいいかなと思ったけど、そもそもユーザー増えることなさそうなのでメモリに全ユーザーのデータ持ってればよさそうだなと思ってそれで実装したらそれで3500くらいまでスコア上がる。
終盤
そこから色々試すも大きくスコア上がらず。
最後にmemosのデータをキャッシュしようと思ったけど、memosは更新があるので複数workerでアプリ起動してたらプロセス間でメモリ共有できないなーと思いつつ、Redisで実装してる時間なかったので、worker数を1にしてメモリにmemosのデータを突っ込めばいいかと思って実装し始めたのが終了一時間前くらい。
なんとか30分前くらいに実装できてベンチとったら8400くらいでて3人歓喜。そんで後はhakoberaさんがNginxをチューニングして9268.6まで上がってフィニッシュ。
終了後
終わった後、workloadオプションってなんだったのかって話ししてて、実はこれあげると負荷増えるけどさばいた分スコア上がるんじゃね?っていうのに終わった後に気づいて悔しかった。
オプション自体には気づいてたけど、単に負荷あげるだけのオプションっぽいから意味ないよね、っていうのでなぜかみんな納得して無視しちゃってた。冷静に考えればそんな無駄なオプションあるわけないのに・・。この日の教訓は「意味のないオプションなどない」でした。
何はともあれ運営の皆さんありがとうございました!とても楽しいイベントでした。本選も楽しみです!
- Prev Entry:静的サイト開発ツールとしてのMiddlemanとGrunt
- Next Entry:Adventar 2013 の楽しみ方