Node.js が PHP より高速である例

私はNode.jsフィーバーがいったいどんなものか見たかったのでGhost(Node.js)とWordPress(php)を使って、直接対決のロードテストを
行ってみることにしました。 結果は信じられないことにGhostがWordPressに圧勝したのです。それはまるで宇宙船が飛行機と競争しているようでした。
(勝手な想像に過ぎないんですけどね。)
最近作られて使えるようになった新しいブログプラットフォームがあります。 一般的に皆からゴーストと呼ばれているものです。ゴーストの面白いところは
Node.jsのプラットフォーム上に構築されています。もしあなたがNode.jsについてあまりご存じなければ、ここで私のブログ投稿を読んでください。もしあなたがGhostについてあまりご存じなければ、
ここでキックスタータープロジェクトを読んでください。

設定
背景を少し説明すると、Ghostは、ただのブログプラットフォームであり、それ以上のものではありません。これに対しWordPressは機能満載のCMSです。私はこれらを出来るだけ公平に比較したかったので、
ロードテストスクリプトをブログページのみに対して実行することに制限しました。 私は「アウト・オブ・ザ・ボックス・エクスペリエンス」をテストしたかったので、

どちらのプラットフォームにも構成変更を加えませんでした。(ただ、どちらもMySQLにフックアップしました)。私はシングル64-bit RHEL m1.ラージ(スペックの参照サーバサイズイメージは下記の通り)インスタンスを
Amazon EC2にスピンアップし、二つのブログプラットフォームをホストしました。

Amazon Server Sizes

私は最も一般的な構成でテストしたかったのでGhostのフロントエンドにNginX を、WordPressのフロントエンドにApacheを使用しました。2つのプラットフォームは
同じローカルMySQLバックエンドデータベースインスタンスをシェアし、(GhostはデフォルトでSQLiteと一緒になりましたが、
バックエンドに公平な競争の場を提供したことを確認したかったのです)。
Ghost (listening on port 80)とWordPress (listening on port 8080)の両方を同時に作動させましたが、どんな時も、
ひとつのブログプラットフォームにはロードを適用しただけです。
このことで、この小さな実験のロードジェネレーションポーションにたどり着きました。 私は同じアビリティーゾーンでは、 テスト結果に対するネットワークインパクトを最小にする為にもう1つのEC2インスタンスにスピンアップしました。(64-bit ウブントゥ、サイズ m1.ミディアム–
スペックの参照サーバサイズイメージは上記の通り)私は
同僚の@dustinwhittleにロードテスト構成を紹介してくれるように頼みました。彼は彼のブログ投稿の中でロードテストツールを紹介してくれ、
包囲攻撃とSproxyの組み合わせを使用することを勧めました。
ブログプラットフォームをインストールして、テストを実行したあと、私は8 パートブログシリーズをプレーンテキスト(画像無し)で、それぞれのサイトに付け加え、
既存のブログを削除しました。WordPressでは、スタンダードURLパターンをそのままにして、パーマリンクは実行しませんでした。
こういった特徴を利用することでスピードが落ちてしまわないようにしたのです。WordPressに対しキャッシングテクノロジーをオンにすることもありませんでした。
なぜなら、私はアウト・オブ・ボックス・エクスペリエンスを測りたかったからです。基本的に全てのプラットフォームでチューニングは一切試みませんでした。
特筆すべきもう1つの主な構成は、ボックスエクスペリエンスのロードテスト中にAppDynamicsマシーンエージェントを利用して、
OSメトリックスを収集、チャート化したことです。

テスト
多くのURLに対したくさんの同時接続をテストする包囲攻撃を使うために、 テキストファイルにURLのリストを作成する必要がありました。このために私が使ったのは、
Sproxyです。基準は、Sproxyを使った詳細を次に表示した中で、 20-23の間でスライドします。https://speakerdeck.com/dustinwhittle/agileperformance-testing-checklist
GhostとWordPressの両方に対しSproxy を作動させ、URLのリストの結果になりました。全く同じリストブログ投稿をを含むように、ファイルの全てを修正しました。
そうすることによりロードテストが出来るだけ似たものになるようにしました。それぞれのファイルの中身は、下記に表示しています。

Ghost Load Test URLS
Wordpress Load Test URLS
さて今、包囲攻撃を起動し、それぞれのブログをロードで攻撃を開始する準備が整いました。包囲攻撃は幾つかのキーパラメタを操作することができる、
良いツールです。私が操作したのはほとんど
リクエストバッチ間での同時接続(-c)とディレイ(-d秒単位)の数です。参照用のコマンドを記します。… siege -v -c 100 -i -t 10M -f urls.txt -d 1

結果

一言で言うと、圧倒的です!100同時接続で10分間の包囲攻撃を実行しました。ウェブリクエストのバッチ間には1秒の遅れが出ました。
結果は下記の通りです…

Ghost Performance Under Heavy Load

高負荷でのNginxを使ったゴーストに対する
包囲攻撃ロードテスト結果。

 

Wordpress Siege Results

高負荷でのWordPressとApacheの包囲攻撃
ロードテスト結果。

10分のテストでの合計トランザクション処理能力を見てみると、上記に示されたアウトプットから見て取れるように、GhostとNginxは、 WordPressとApacheより
約678%パフォーマンスが良いという結果になりました。驚いたことに、Ghostの最長トランザクションレスポンスは2.62
秒でした。それに比べ、WordPressは、最悪の33.41秒でした。私は何度もこれらのテストを実行しましたが、結果は全て近似値でした。
そういうわけで、無駄を省く為、テスト結果は表示しません。 ここでの私の目的は、変化する負荷のもとでのパフォーマンスを徹底分析をすることではなく、
実質負荷を作り、それぞれのプラットフォームがどのようにその負荷を処理するか観察することです。
他にも注記すべき興味深いデータポイントがあります。ロードテストの間、Ghostはたった1つのプロセスだけを実行し、Nginx は、2つのプロセスを実行しました。
WordPressとApacheは、というと包囲攻撃そのものが100同時接続だったので、
合計最大110 httpdのプロセスを実行することになりました。ロードテストで興味深い部分は、CPUデータの中にあります。私は平均、最小、最大CPU
使用率を下記チャートに表示しました。GhostのCPU消費が約40%なのに対し、WordPressの消費が約
70%であることが明確に見て取れます。

Ghost Heavy Load - AppDynamics

CPU消費率がGhostのロードテスト中のに平均、最小、最大値を示しています。

Wordpress Heavy Load - AppDynamics

CPU消費率がWordPressのロードテスト中に平均、最小、最大値を示しています。

でも私が標準的なローディングパターンを忘れてしまったと思わないでください。私が100同時接続テストでこれらのプラットフォームに設定した 超高負荷と比べて、
ゆるやかな負荷をかけた場合どのように見えるでしょうか?どうなるか見るために同時接続の数を減らしてみました。
同時接続を10まで減らし、接続バッチ間の遅れを5秒に設定しました。結果は下記の通りです。
やはりGhostの方が信じられないくらい圧倒的です。WordPressは全ての方法でパフォーマンスに見劣りしました。Ghostは高い処理能力を見せ、
さらに最も重要なことは、最も遅いトランザクションレスポンスでも .18 秒であったことです。これに比べ、WordPressは2.72秒でした。 CPUの観点から見るとGhostはこのテストの間、平均4%しか消費していません。
一方でWordPressは平均30%を消費しています。

高負荷でのNginxを使ったゴーストに対する軽負荷。

高負荷でのNginxを使ったゴーストに対する
軽負荷。

Siege load test results for WordPress with Apache under light load.

WordPressとApacheの軽負荷での
包囲攻撃ロードテスト結果。

2013年10月18日更新 – フェアじゃないね!!! 比較なんてできないよ!!!
比べ物にならない、という人もいました。 これいたいして私は、「そう、君はまったく正しいよ!」と言いたいです。この点では
私は一般的な組み合わせであるNginx + Ghost、そしてApache + WordPressを比較するつもりです。 チューニングなし、キャッシングなしの最も基本的なフォームで、
アウト・オブ・ボックスのシンプルな結果を比較するつもりです。しかし私は抗議の声も理解できるので、公平な場を設けようと決めたのです。Apacheが障害になるので、
私がGhostに対しApacheをフロントエンドウェブサーバーととして使い、 再度ロードテストテストを実施しようと決めたのではないかと考えた人もいます。私は何度も繰り返しテストを実施しましたが、
テスト結果はすべて非常に近似していたので、多くのテストのうちの1つだけ結果を提示します(下記をご覧ください)。

Apache + Ghostのロードテスト結果。

Apache + Ghostのロードテスト結果。

"Nginx

上記に示された結果は、興味深いものです。Apache + Ghostは、実はGhost + Nginxよりもわずかに速かったのです。
GhostはApacheを利用してもNginx利用しても、やはりウェブサーバーとして超高速なのです。

結論
Ghostは圧倒的に速く、 WordPressよりも多くのロードを処理できるが、 またCPUリソースの消費もずっと少ない
(GhostはWordPressに比べ、かなり少ない機能性しかないが、その点は今回のテストの目的とは関係しません)。私は、Ghostを2プロセスのNode.jsのclusterの中で動かし、
処理能力とCPU使用率においてどんな違いが出てくるのか興味があります。 ふむふむ、それはもう1つのブログ投稿の
テーマとしてすごく良い…。
私がここで記載しなかったもう1つの興味深いトピックは、これらのプラットフォームの両方をモニタリングすることです。私の中で、これらのプラットフォームの動きをを外から観察するだけでは、
物足りないのです。内側で何が起きているのかを見たいのです。将来ブログ投稿の中で、
AppDynamicsでWordPressを監視します。両方ともに、どのような中身になっているのか今から楽しみです。
2013年11月14日の更新:リクエストが多かったので、さらにテストしました。今回はPHPのオペレーションコード キャッシュを使用しました。詳細は
「An Example of How Node.js is Faster Than PHP – Part 2(Node.jsがPHPよりも高速である例 – パート2)」にて確認できます。

付録
ブログとテストのプラットフォームの構築に使用した情報へのリンクです(
構成が各記事と異なっていたため、それぞれ関連する部分を利用しました)。

Node.jsのインストール方法: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
Ghostのインストール方法: http://docs.ghost.org/installation/
MySQLのインストール方法: http://www.cyberciti.biz/faq/how-to-install-mysql-under-rhel/
NginXのインストールと構成方法、MySQLの使用方法:http://0v.org/installing-ghost-on-ubuntu-nginx-and-mysql/#.Ul26n2RATL4
Siegeの場所: http://www.joedog.org/siege-home/
Sproxyの場所: http://www.joedog.org/sproxy-home/
SiegeとSproxyの使用についての詳細情報: http://www.euperia.com/linux/tools-and-utilities/speed-testing-your-website-with-siegepart-two/771