7/30 ISUCONの練習始めました
今年こそISUCONに出たい
前々からISUCONにチャレンジしてみたいなぁーと思っていたのもあって, 今年こそはちゃんと練習しようと思っています. 夏休みに入って時間も取れるようになってきたので.
とりあえず, Vagrant使って過去問を触ってみる. ISUCON過去問とほぼ同じサーバー環境をVagrantで構築するためのVagrantファイルを公開してくださっている方がいるので, それを使う. 圧倒的感謝.
環境構築の手順
リポジトリをgit cloneして立ち上げたい問題のディレクトリに移動, vagrant upするとサーバーが起動する. ちなみに, 起動には結構時間がかかるので注意. あと, なぜかISUCON6のqualifyはうまく立ち上げられなかった. というわけで, isucon5-qualifyを立ち上げてとりあえずベンチを取ってみるところまでメモしておきます.
1. Virtualbox, Vagrantのインストール
brew cask install virtualbox brew cask install vagrant
すでにインストールしている場合は, バージョンが古いとエラーが出ることがあるようなので再インストールしておくといいと思います.
brew cask reinstall virtualbox brew cask reinstall vagrant
2. Vagrantfileが入っているリポジトリをcloneしてくる.
git clone https://github.com/matsuu/vagrant-isucon.git
3. 立ち上げたい問題のディレクトリに移動してvagrant up
cd vagrant-isucon/isucon5-qualifier/
vagrant up
これが結構時間かかります. 気長に待ちます. 諸々の準備が終わるとimageというサーバーとbenchというサーバーが起動しているはずです. きちんと把握してないですが, imageは問題を解く用, benchは負荷走行用かなと思っています. おそらく, 予選本番ではimageの方だけが参加者には与えられていて, benchサーバーにはベンチマーク取ってくださいってリクエストをするだけなのかと.
もしかしたらstandaloneは両方立ち上げないのかも. そうだとしたらそっちの方が早く起動できる(?).
4. imageサーバーにsshで接続する
vagrant ssh image
5. ユーザーを切り替える
ログインするとvagrantユーザーになっていると思うので, isuconというユーザーに切り替えます.
sudo su - isucon
そこでlsしてもらうといろいろファイルがあるのがわかると思います. 基本的にはアプリケーションなどの中身は/home/isucon以下に置かれてます.
6. とりあえずベンチを取ってみる
/home/isucon以下にbench.shというスクリプトがあるのでそれを実行します.
./bench.sh
しばらく待っているとベンチが終わって, 以下のような結果が標準出力に出てきます. これがスコアになるようです.
... Isucon5Checker done success 114.1 {"success"=>206, "redirect"=>81, "failure"=>1, "error"=>0, "exception"=>0} アプリケーションが 3000 ミリ秒以内に応答しませんでした
ここからやること
基本的にはNginxとMySQLのログを見ながらボトルネックになっている箇所を探していくことになるかなぁと考えています. MySLQはベンチ取った時のログをざっと見る限りでは結構N+1クエリがありそう. 他にもいくつか時間かかっているクエリもあったのでそのあたりを中心に見ていくことになりそう. あと, 実際にブラウザからアクセスもしてみるとどういうお題なのかわかりやすくていいかなぁと.
チームメンバーに競プロerがいるので, C++でゴリゴリ書き直すみたいな戦略も面白いかなぁって思っている. ちなみに, 昨年はC++で予選を突破したチームが1つだけいた模様. と思って調べてみたらまさかのこのチームで爆笑してしまった.
ISUCON6予選をC++で参加して予選通過した話 - いもす研 (imos laboratory)
さすがに自前でC++のWebサーバーを作るのは険しすぎるのでC++でCGIとか作ってみるのはどうかなぁなんて考えているところ. どれぐらい速度出るか全くわからないけれど.