この1年くらいで手がけているプロジェクトのバックエンドはすべてJavaなのですが、「Node.js、良いですよ」という話を聞いて、勉強と検証をしております。
今回は、軽くNode.jsの勉強をした上で、Node.jsとPHPとJavaの簡単なパフォーマンス比較をしてみようと思います。
Node.jsの勉強
とりあえず、Node.jsの本を一冊読みました。
httpモジュールを使ってWEBサーバを起動するところから、PostgreSQLやMongoDBへのアクセス、Sailsを使ったMVCアプリケーションの構築まで、とても分かりやすく全体を追える本でした。
JavaScriptについての解説はないので、言語としてのJavaScriptについては別で学ぶ必要があります。
これを読んで、「Node.jsをサービスに投入すること自体はできそうだ」というイメージが湧いたところで、実際に速いのか試してみました。
ベンチマークコード
DBアクセスを含むような場合も比較するつもりですが、今回はとりあえず静的なHTMLを返すだけの処理で、並列数に対するレスポンスタイムの依存性の比較をしてみようと思いました。
まずNode.jsの場合。
http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/html'}); response.end('Hello Node.js!'); }).listen(8080);
続いて、PHPの場合です。
Hello PHP!');
そして、Javaの場合。
public class App extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().println("Hello Java!"); } }
ソースコードは、GitHubに置いておきます。
katty0324/HelloWorldBenchmark
Webアプリケーションの起動
Webサーバには、Amazon EC2のm3.mediumインスタンスを利用しました。
必要なソフトをインストールした上で、それぞれの言語のWebアプリケーションを起動します。実運用環境とは違いますが、検証可能な範囲で楽な方法を選びました。
Node.jsの場合は、nodeコマンドで起動することにします。
node app.js
PHPは、Apacheを使います。httpdは、yumからインストールして、特別な設定の変更はせずに使います。
sudo /etc/init.d/httpd start
Javaは、Mavenから起動します。サーブレットコンテナはTomcatにしました。
mvn clean tomcat7:run
パフォーマンステストの方法
パフォーマンスの検証は、簡単さ重視でApache Benchを使うことにしました。
リクエスト回数は10万回。並列数を変えながら、所要時間を測定します。
ab -n 100000 -c 10 http://ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com/app.php
負荷をかける側のサーバは、m3.xlargeにしました。
結果
いまいち面白くない結果となりました・・・。
並列数 | Node.js | PHP | Java |
10 | 48.23 | 50.745 | 23.26 |
100 | 46.659 | 49.414 | 17.757 |
200 | 47.032 | 47.514 | 25.846 |
300 | 49.319 | 19.107 | |
400 | 50.29 | 20.799 | |
600 | 50.307 | 20.404 | |
800 | 19.855 | ||
1000 | 19.941 |
Node.jsとPHPが途中で切れているのは、それ以上並列数を上げるとエラーを返してしまったためです。
Node.jsとPHPのレスポンスタイムはほぼ同等で、Node.jsの方が高い並列数にも耐えられました。Javaはレスポンスタイムが他の2つの半分以下で、並列数を上げてもエラーを返しませんでした。
本当は、「node-js-vs-apache-php-benchmark」で紹介されているような、Node.js以外は並列数によってレスポンス時間が伸びていくような結果を期待していたので、残念。ソースコードや検証方法を見たところ同じような感じなんですが・・・。
まとめ
この結果だけ見るとJava最強でした。PHPはロードアベレージが100を超える場面も見られました。
Node.jsを使ってみたいですが、このままじゃ使う理由がなくなってしまうので、もっと検証してみたいと思います。
- データベースアクセスのような待機時間の長い処理をしたらどうなるか?
- 計算のようなCPU負荷のかかる処理をしたらどうなるか?
- もっと実際に運用する環境に近づけたらどうなるか?
- パラメータをチューニングしたらどこまで上げられるか?
- 負荷は本当に設定通りにかけられているのか?
もしかしたら続くかもしれません。