HHVM(HipHopVM)のFastCGIを軽く試す
本記事は、12/21に開催されたHachioji.pm #36でおこなったLTの焼き直しです。
DISCLAIMER
本記事のベンチマークは非常に適当です。
出てきた数字をみるかぎり、私感として極端にメチャクチャということはないとおもいますが、この数字を一人歩きさせないようにしましょう。っつーか簡単だし是非御自身でベンチしてみましょう!!
HHVMとは
PHPerの皆様ならHipHopはご存じでしょう、PHPをC++に変換することで処理速度を上げる物です。しかし、一度コンパイルするのでヒジョーーに面倒な物になっていした。
HHVMはC++コード(やバイナリ)に変換することなく、PHPのコードをJITで最適化しつつ、動作させるもので、先日本家(C++変換版)の速度を抜いたというのが記憶に新しい所です。
http://www.hhvm.com/blog/2027/faster-and-cheaper-the-evolution-of-the-hhvm-jit
(理想的には)HHVMは、PHP(のFPMなど)と置換することで、速度の大幅な向上が期待できます。
HHVMでついにFastCGIサポート
さて本題。ついにHHVMでFastCGIのサポートが開始され、php-fpmとほぼ同様に扱う事ができるようになりました。
http://www.hhvm.com/blog/1817/fastercgi-with-hhvm
まあ、HHVMをhttpdと見てリバースプロキシ的に使えばいままでもつかえていたのですが、FastCGIの方が色々楽で速いですからね。
HHVMは簡単に試せる
HHVMはCentOSなどではいまだビルドが非常に面倒ですが、debian系、つまりUbuntuなどでは気軽に入れる事ができます。
今回Ubuntu 13で試しましたが、以下一発でHHVMが入ります、簡単便利。
echo deb http://dl.hhvm.com/ubuntu saucy main | sudo tee /etc/apt/sources.list.d/hhvm.list sudo apt-get update sudo apt-get install hhvm-fastcgi
HHVM起動方法
細かい事はドキュメントを見て頂くとして
cd /path/to/docroot hhvm -m server -vServer.Type=fastcgi -vServer.Port=9000
このようにすれば立ち上がります。上はPHPのBuiltin Serverと同様の挙動になります(デーモンモードもあります)。
nginxとの連携
特に説明する必要もないかもですが、
nginx.conf
index index.php index.html index.htm; (略) location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; }
さすがFastCGI、コンフィグがシンプルですね。
ここまで適当に設定して、Hachioji.pm前の温泉ハッカソンでゴロゴロしながら1時間くらいでWordpressを動かす所までいきました。
メッチャ簡単便利ですね…、正直HHVMのためにCentOSを捨てようかというレベルで。
さて、簡単にベンチ
勿論気になるのがベンチですよね。
今回WordPressの最新版を、PHP5.5.3*1 のphp-fpmと比較する形でベンチマークをしてみました。バックエンドはmysql5.5のいれたままの状態です。
記事は2通ほど投稿したトップページを回しています。
ベンチマークはApache Benchで、並列度3、100リクエストです。
リクエスト自体は、別ホストからおこなっています。
ローカルでブチ叩けばもっと速度がでるかなと思います。
(正直、素のWordpressはそれなりに重いので、どうせそんな速度でないし…)
さて、雑なベンチが以下。
php-fpm php5.5.3
Time taken for tests: 5.782502 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 898084 bytes
HTML transferred: 874012 bytes
Requests per second: 17.29 [#/sec] (mean)
Time per request: 173.475 [ms] (mean)
Time per request: 57.825 [ms] (mean, across all concurrent requests)Connection Times (ms)
min mean[+/-sd] median max
Connect: 18 19 3.0 18 36
Processing: 128 150 11.1 148 187
Waiting: 109 130 11.0 128 168
Total: 149 169 11.8 166 205
HHVM
Time taken for tests: 3.284446 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 896484 bytes
HTML transferred: 874044 bytes
Requests per second: 30.45 [#/sec] (mean)
Time per request: 98.533 [ms] (mean)
Time per request: 32.844 [ms] (mean, across all concurrent requests)Connection Times (ms)
min mean[+/-sd] median max
Connect: 18 18 1.7 18 30
Processing: 59 77 3.9 77 85
Waiting: 41 57 3.7 58 65
Total: 88 96 3.9 96 105
17/sec->30/sec!(約1.7倍!)
一部の情報ではJITのためにウォーミングアップをしないと性能がでないということだったのですが、結構たたいてもあまり数字がかわりませんでした。
いやはや、なにもしないでHHVMに差し替えるだけで1.7倍というのは良い感じです。
ちょっと前までPHP5.5(+OpCache)に負けていた、という記事も有りますが*2、今回私が試した範囲では、HHVMの方が優位に見えます。
注意点
「HHVMはPHPにあらず」に注意する必要があります。一部のWAFやアプリはまだ「うごきません」。
目下開発進行中であり、動くライブラリは増えています。
http://www.hhvm.com/blog/2813/we-are-the-98-5-and-the-16
Wordpress自体、最初はうごかなかったけど、動くようになりましたしね*3。
私の好きなSlimやTwigは普通に通る様です、めでたい。
ただ、検証方法が「テストコードが通す」事っぽいので、PHPと同じ挙動を保障しているわけではありませんね。
つまりテスト外のバグや挙動差を踏み抜く可能性がありますね!*4
後、古かったり、トリッキーな書き方しているコードはおそらく今後ともサポートされない気がします。
(将来PHP本体にマージされる…というHypeっぽい煽り記事はみかけますが)
「レガシィ〜コ〜ドも、待っていればいつかはHHVMで高速化!」というのはなさげです。
やる気があるなら実際にテストかいて、自分で回し続けないと行けない感じですね…、すくなくとも、今後しばらくはそうでしょう。
上記注意点よりよっぽどな注意点
最初に書きましたが、LTのネタとして試したので、ロクな計測ではありません。
もっと良い検証が求められています!!!いまならふぁぼ!とれますよ!!
こちらからは以上です。
*1:なんで5.5.7じゃないのかって?単純に5.5.3がaptで入るからです!
*2:http://www.alexfu.it/2013/10/22/symfony-benchmark-on-hhvm.html
*3:とはいえ、今回試した時点でも、定数周りのWarnがでてましたが
*4:まあ、HHVM関係無いバグもあるでしょうしね