「takayamaさんはブログ書かないんですか?」と聞かれて早2年弱。
象より重い腰がようやく上がりました。
今回は新製品を開発するに当たり採用するWebフレームワークを選定するために
- Scala + PlayFramework2
- node.js + express
- perl + Mojolicious
(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さんありがとうございます!
※コメント・はてぶコメント等々 情報ありがとうございます!
週末にでもまとめて再試してしてみたいと思います。
3 コメント
Write コメントnode(というかexpress)は
Reply$ NODE_ENV=production node app.js
ではやくなるかとおもいます
"plackup -E production" does not work with Mojolicious. You should also use "ab -k" for more realistic results.
ReplyXitrumはどうですか?
Replyhttp://ngocdaothanh.github.com/xitrum/
https://gist.github.com/3293596