uzullaがブログ

uzullaがブログです。

HHVM(HipHopVM)のFastCGIを軽く試す

本記事は、12/21に開催されたHachioji.pm #36でおこなったLTの焼き直しです。

DISCLAIMER

本記事のベンチマークは非常に適当です。
出てきた数字をみるかぎり、私感として極端にメチャクチャということはないとおもいますが、この数字を一人歩きさせないようにしましょう。っつーか簡単だし是非御自身でベンチしてみましょう!!

HHVMとは

PHPerの皆様ならHipHopはご存じでしょう、PHPC++に変換することで処理速度を上げる物です。しかし、一度コンパイルするのでヒジョーーに面倒な物になっていした。

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*1php-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関係無いバグもあるでしょうしね