読者です 読者をやめる 読者になる 読者になる

ISUCON夏期講習に行って来ました。

ISUCON夏期講習に行って来ました。今年秋開催のISUCON3では学生枠があるということで、ISUCON3に向けて興味ありそうな学生を募ったイベントでした。@tagomorisさん, @kazeburoさんをはじめLINE社の方のアドバイスを受けながらISUCON2の問題に挑戦し、惨敗し、でも終わったあとはその場でチームとして出ようかという話があがったりと素晴らしいイベントでした。
Line社の皆様, 貴重な機会をどうもありがとうございました!





!





isucon夏期講習は本当にすばらしいイベントでした。自分がチューニング房になるのには十分すぎるイベントでした。ということで、以下、ローカルVMでisucon2再チャレンジした話です。


ローカルVMのスペックはメモリ1GBのコア1です。
ISUCON夏期講習のサーバーを思うと、涙が出てきそうですw


WEBアプリはRuby製ので挑戦。
デフォのスコアはこんなところでした。
f:id:karahiyo:20130805000828p:plain

ベンチマークツール実行中の負荷をみてみると、
メモリー使用率は40%ほどですが、CPU使用率が常にほぼ100%で、その内訳はunicornmysql、そして、ベンチマークツール自身wでした。
ベンチマークツール自身というのがしんどいところですが、まずやることはかわらずCPUのボトルネックの解消です。アプリの処理を最適化し、メモリを効率的に使い、CPUの処理がボトルネックにならないようにすればいいと。

1. apacheからnginxに移行
2. MySQLのslow queryの解消
3. app.rbの最適化

nginxに移行

yumでも入るが、あとからチューニングしやすいようにソースからいれる。
作業ディレクトリを小さくまとめたいので、webappディレクトリ下にビルドする。

$ export CWD=`pwd`
$ wget http://nginx.org/download/nginx-1.5.3.tar.gz
$ tar zxf nginx-1.5.3.tar.gz
$ cd ngx-1.5.3
$ ./configure --prefix=$$CWD/nginx --with-http_gzip_static_module
$ make
$ make install

ここで、ISUCONのアプリのコンテンツはサイズが大きいため、事前に各コンテンツをgzip圧縮して転送するよう、--woth-http_gzip_static_moduleオプションつけてビルド。



そのまま動作させるとnginxがhttpアクセスをさばけすぎて、しかしサーバー内の処理が追いつかないためベンチテストFAILED。


CPUにやさしい設定にする。

worker_process 1;
worker_connections 512;
keepalive_timeout 0;

f:id:karahiyo:20130805005803p:plain

MySQLのslow queryの解消

slow queryログを出力するように設定。

slow_query_log = ON
long_query_time = 0.001
slow_query_log_file = /var/lib/mysql/mysql-slow.log
log-queries-not-using-indexes

explainなどで確認しながら、インデックスを貼る。
f:id:karahiyo:20130805010336p:plain

nginxトラフィックのチューニング

@kazeburoさんのブログを参考に、通信量の改善を図る。
rewrite_by_lua 'ngx.sleep(5.0)'くらいが自環境では一番性能がでた。

f:id:karahiyo:20130805012306p:plain


!


次に、また@kazeburoさんのブログを参考に、チケット購入トランザクションの効率化をしようと試みた。
ベンチマークツール起動時にデータベースを初期化し、そのあとにランダム席データを作成するはずが、データの作成自体がタイムアウトしてしまった。

やりようはいくらでもあるが、とりあえずここまでで。
会場に用意されていたAWSだったらどれくらいスコアでるのだろう。「いや、少なく見積もってもこれは2,3はあるよ!」
f:id:karahiyo:20130805161530p:plain

© karahiyo