PHP7からHHVMに移行する&ベンチマーク

author potpro(ぼとぷろ)
2017/11/07

PHP7からHHVMに移行する&ベンチマーク

HHVM(HipHop Virtual Machine)とは

HHVMは、Facebookが作成したPHP互換の仮想マシンです。
JITコンパイルを採用しており、パフォーマンス向上を目指しています。
割と歴史があるようで、PHP7のない2014年ごろから爆速仮想マシンと言われていたみたいですが、 PHP7が早いよすげーって感じで埋もれたようです。(2016年に日本語情報が全く無い)

でもこちらも長い時間をかけて速度向上しているようで、
今でもベンチマークをとった感じPHP7と比較しても30%以上早いんじゃ無いかという感じです。
というより早すぎてビビる。

裏でファイル情報を読み込みまくるプログラムなんかは、レスポンスが2倍くらい早くなりました。
この辺りネイティブコードが強いんだろうなという感じ。

Hack言語というAltPHPな言語も使えますが、PHP5.6ベースであり、そのままのPHPコードでも動作します。
(ここではHack言語には一切触れませんが、イメージとしてはJavaScriptとTypeScriptの関係みたいな感じです)
そのためPHP7で廃止になってしまったメソッドも含まれていますが、もちろんPHP7の機能も使えます。

ここまで利点があるのにでもやっぱり日本だと知名度無い・・・無く無い?
もう開発期間もかなり経ってますしFacebookで実運用されていることから、かなり安定しているのでは?と思うのですがね。

インストール

とりあえず公式を見ているとyumリポジトリも無くそもそもGetting Starterに無いので
「CentOSじゃなくてUbuntu/Debianを使え」って感じですが、
そんなこといってもこのサーバはCentOSなので、CentOS向けに構築します。
Ubuntu/Debianであれば、おなじみのapt-getで簡単セットアップできます。羨ましい。

building-and-installing-hhvm-on-centos-7.x

ここに書いてあるやり方で、最新バージョンではビルドが通りませんでした。
どうやら最新のバージョンでは、依存するライブラリのバージョン(GCCとか)がCentOS7の公式yumリポジトリでは古いため、
多くのライブラリやコンパイラをソースビルドする必要があるようです。

building-and-installing-hhvm-on-centos-6.6

ここに書いてある方法を実践すればCentOS6でも7でもいけると思いますが、
かなりのパッケージをソースビルドする必要があり、非常に時間がかかるためちょっと断念。

そのため、公式から現状で一番手軽に入れられるであろうプレビルド版3.15.3を使用します。
rpmを使用してインストールします。yumよりは手間ですが、ソースビルドを考えるともの凄く楽ですね。
Prebuilt-Packages-on-Centos-7.x

ここに書いてあることを実践すればすぐにインストールできました。

yum install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc,numactl}-devel \
{ImageMagick,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre}-devel \
lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel \
{unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel \
glog-devel oniguruma-devel ocaml gperf enca libjpeg-turbo-devel openssl-devel \
mariadb mariadb-server make libc-client -y

rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.15.3-1.el7.centos.x86_64.rpm

hhvm --version
HipHop VM 3.15.3 (rel)
Compiler: tags/HHVM-3.15.3-0-g965cd8d30670726d88720412c3384225a2da011d
Repo schema: 7f22464926cb7fc3a19c6af88309c612a8581c55

ビルトインウェブサーバーで使用する

PHP仮想マシンなので、基本的にはPHPと同じように使えます。
テストとして、PHPと同じようにビルトインウェブサーバー機能を使ってみましょう。
PHPソースも特に変更する必要はありません。 phpinfo() も使えます。

# PHPの場合
cd ~/html/
php -S localhost:8000

# HHVMの場合
cd ~/html/
hhvm -m server -p 8000

Nginx+HHVM(FastCGI Mode)で使用

実環境するのであれば、Nginx+PHP-FPMが今の環境です。
やはり稼働も大変なんでしょう?と思いがちですが、 PHP-FPMをそのままHHVM(FastCGI Mode)に差し替えるだけでOK。
うまくやればNginx側の設定は一切変更なし or 一行変更でいけます。

設定ファイルは/etc/hhvm/server.iniで設定を行います。
しかし最初から最適化されていたりもするので、ほぼ設定なしでもそれなりに動きます。すげえぜ。

# ログディレクトリを設定
mkdir /var/log/hhvm/
chown nginx -R /var/log/hhvm/
chgrp nginx -R /var/log/hhvm/

# runディレクトリの設定
mkdir /var/run/hhvm
chown nginx -R /var/run/hhvm/
chgrp nginx -R /var/run/hhvm/

# php-fpmをストップ。この時点でPHPは動かなくなるので慎重に
systemctl stop php-fpm

# service
systemctl enable hhvm
systemctl start hhvm

/etc/hhvm/server.ini


; hhvm specific
hhvm.pid_file = "/var/log/hhvm/pid"
hhvm.server.port = 9001

;hhvm.server.file_socket = /var/run/hhvm/hhvm.sock
hhvm.server.type = fastcgi
# 略
date.timezone = Asia/Tokyo

/etc/nginx/conf.d/nginx.conf

# 前略 ほぼ変更なし
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
# 後略

Wordpressでベンチマーク

簡単にApache Benchを使ったベンチマークもやってみましょう。
そのまま、このブログを対象としています。 ** そう、このブログは既にHHVMに移行済みです。 **

Nginx + php-fpm(PHP7)版

ab -n 500 -c 100 https://blog.potproject.net/

Concurrency Level:      100
Time taken for tests:   76.811 seconds
Complete requests:      500
Failed requests:        0
Total transferred:      41469000 bytes
HTML transferred:       41329000 bytes
Requests per second:    6.51 [#/sec] (mean)
Time per request:       15362.273 [ms] (mean)
Time per request:       153.623 [ms] (mean, across all concurrent requests)
Transfer rate:          527.23 [Kbytes/sec] received

Nginx + HHVM(FastCGI Mode)版

ab -n 500 -c 100 https://blog.potproject.net/

Concurrency Level:      100
Time taken for tests:   24.787 seconds
Complete requests:      500
Failed requests:        0
Total transferred:      41467500 bytes
HTML transferred:       41329000 bytes
Requests per second:    20.17 [#/sec] (mean)
Time per request:       4957.490 [ms] (mean)
Time per request:       49.575 [ms] (mean, across all concurrent requests)
Transfer rate:          1633.71 [Kbytes/sec] received

処理によっては速度はまちまちですし、場合によってはPHP7の方が早いかもしれませんが、 これだけでも爆速の恩恵がわかると思います。単純比較で3倍ですよ。こりゃ早え。

とりあえず、日本での知名度は上げたいですね。
まあ、スルーしていてどういうのかは自分も最近どういうものか知ったわけなので人のこと言えませんが・・・
(なんか名前的に難しそうで・・・HHVM/Hackだもんなあ・・・)