PlayFramework2が驚くほど早い!

このエントリーをはてなブックマークに追加
こんにちは。 R&D部のtakayamaです。

「takayamaさんはブログ書かないんですか?」と聞かれて早2年弱。
象より重い腰がようやく上がりました。

今回は新製品を開発するに当たり採用するWebフレームワークを選定するために
の3つのフレームワークのベンチマークを測ってみました。
(R&D部ではScala+Play2を推進しています。僕はperlとnode.jsが好きです。)


ベンチマークを行ったそれぞれの構成は以下のようになっています。

OS CPU メモリ kernel version
クライアントマシン Scientific Linux 6.0 Xeon 3040 1.86GHz 4G 2.6.32-279.5.1 x86_64 smp
サーバマシン Fedora 17 Core i7-3520M 2.9GHz 8G 3.5.4-2 x86_64 smp

Scala + Play2 JDK: 1.7.0-07
scala: 2.9.1
Play2: 2.0.4
nodo.js + express node.js: v0.8.11 express: 3.0.0rc4
perl + Mojolicious perl: 5.16.1 Mojolicious: 3.44
Plack: 1.0004
IO::Socket::INET: 1.33
EV: 4.11

僕はperlとnode.jsは多少経験がありますがscalaはまだまだ初心者なので、
フレームワークがgenerateする土台にテンプレートの出力だけ「Hello World !」にしたもので比較していきます。



さくっとそれぞれ起動して、apache bench 100同時接続 10000リクエストを投げてみましょう。

$ ab -n 100000 -c 100 http://192.168.X.X:YYYY/

Requests per second Time per request
perl + Mojolicious (daemon起動)
$ ./script/my_bench -m production daemon
791.12 [#/sec] (mean) 126.403 [ms] (mean)
perl + Mojolicious + EV
$ ./script/my_bench -m production daemon
778.11 [#/sec] (mean) 128.517 [ms] (mean)
node.js + express
$ node app.js
3183.16 [#/sec] (mean) 31.415 [ms] (mean)
scala + Play2
$ play start
8439.64 [#/sec] (mean) 11.849 [ms] (mean)


・・・・
圧倒的じゃないか・・・

いや、ほら、
scalaはきっとthreadとかつかって待ち受けプロセスを分散しているから早いのでしょう。
perlとnode.jsも分散しないとフェアじゃないよね!

perl + Mojoliciousは組み込みpreforkサーバのHypnotoad
node.js + expressはclusterを使って分散させてみます。

Requests per second Time per request
perl + Mojolicious + Hypnotoad
$ hypnotoad ./script/my_bench
1317.51 [#/sec] (mean) 75.901 [ms] (mean)
perl + Mojolicious + Hypnotoad + EV
$ hypnotoad ./script/my_bench
1348.99 [#/sec] (mean) 74.130 [ms] (mean)
node.js + express + cluster ( 4プロセス )
$ node app-cluster.js
6067.30 [#/sec] (mean) 16.482 [ms] (mean)
scala + Play2
$ play start
8439.64 [#/sec] (mean) 11.849 [ms] (mean)

ぐぬぬ・・・・



悔しくてたまらないのでちょっとズルをしてしまいます。
perlは素のPlackさんとIO::Socket::INET
nodeはcreateServerに直接応答を返してもらいましょう。

Requests per second Time per request
perl + Plack
$ plackup perl-plack.psgi
2333.69 [#/sec] (mean) 42.851 [ms] (mean)
perl + IO::Socket::INET
$ perl perl-inet.ppl
8788.08 [#/sec] (mean) 11.379 [ms] (mean)
perl + IO::Socket::INET ( prefork実装 )
$ perl perl-inet-prefork.pl
9265.03 [#/sec] (mean) 10.793 [ms] (mean)
node + createServer
$ node node-simple.js
8204.96 [#/sec] (mean) 12.188 [ms] (mean)
node + createServer + cluster
$ node node-simple-cluster.pl
9219.78 [#/sec] (mean) 10.846 [ms] (mean)
scala + Play2
$ play start
8439.64 [#/sec] (mean) 11.849 [ms] (mean)


うん。そうですよね!
さすがに何も処理してないのに負けたらどうしようかと思いました・・・
でもフレームワークとしての処理はほとんどしていないわけで・・・


結論!
JDK + scala + PlayFramework2 は早い!

※IO::Socket::INET の prefork実装は@kazuhoさんのこの記事を参考にさせていただきました。
ありがとうございます。
※perlかnode.jsでPlay2に勝つ方法をご存知な方がいらっしゃいましたら、教えていただけると涙を流して喜びます(僕が)
※今回のベンチマークに使ったコードと結果はこちらです。






おまけ


ついでにnginxが「Hello World !」とだけ書いてあるテキストを返すベンチマークも測って見ました。

Requests per second Time per request
nginx 9338.20 [#/sec] (mean) 10.709 [ms] (mean)
scala + Play2
$ play start
8439.64 [#/sec] (mean) 11.849 [ms] (mean)




追記

id:tokuhiromさんより「とりあえずStarman」とのアドバイスを頂いたので測ってみました。

Starmanのバージョンは 0.3003 です。

Requests per second Time per request
perl + Mojolicious + Starman
$ plackup -s Starman -E production --workers 4 ./script/my_bench
1478.48 [#/sec] (mean) 67.637 [ms] (mean)
perl + Starman
$ plackup -s Starman --workers 4 ../perl-plack.psgi
11038.16 [#/sec] (mean) 9.059 [ms] (mean)

Starmanさん早ーーい!!!
Starmanさんのおかげで生きる希望が湧いてきたので、
また暇を見つけてPSGI対応のperl製Webフレームワークのベンチも測ってみます。
id:tokuhiromさんありがとうございます!



※コメント・はてぶコメント等々 情報ありがとうございます!
 週末にでもまとめて再試してしてみたいと思います。
次の記事
« Prev Post
前の記事
Next Post »

3 コメント

Write コメント
匿名
AUTHOR
2012年10月10日 0:29 delete

node(というかexpress)は
$ NODE_ENV=production node app.js
ではやくなるかとおもいます

Reply
avatar
匿名
AUTHOR
2012年10月10日 2:14 delete

"plackup -E production" does not work with Mojolicious. You should also use "ab -k" for more realistic results.

Reply
avatar
匿名
AUTHOR
2012年10月16日 11:12 delete

Xitrumはどうですか?
http://ngocdaothanh.github.com/xitrum/
https://gist.github.com/3293596

Reply
avatar
Related Posts Plugin for WordPress, Blogger...