数年運用を続ける既存プロダクトに対し、HHVMの導入を試みた話

前書き

こんにちは。サーバエンジニアの畑です。
Facebook社が提供する開発言語
及びその実行環境であるHack/HHVMが
PHP界隈にて話題になっているかと思います。

弊社でも“既存プロダクトに対しHHVMを導入できるか”
というテーマで技術検証を行ってみました。

この記事では、
「HHVMの導入において苦労した点」
「HHVMを導入した場合のパフォーマンス比較」
について扱います。

同じくHHVMの導入を検討されている方のご参考になれば幸いです。

導入対象のプロダクト

  • 弊社で数年運営を続けているWebアプリ(ブラウザゲーム)
  • プロダクトの動作環境
    • PHP: PHP5.6.26
    • OS: CentOS 6.4
    • Webサーバ: Nginx 1.10.1
    • DB: MySQL 5.6.33

導入するために実施したこと

1. CentOS上に導入を試みるも失敗

まず、プロダクトの開発環境サーバ(CentOS 6.4)のコピーを作成し、
HHVMのインストールを試みました。
しかし、HHVM公式では、CentOS版をサポートしていません
(サポート対象のディストリビューションについては
こちらをご覧ください)。

そのため、旧ドキュメントや日本語の記事を読みつつ、
以下の方法でHHVMのインストールを試みました。

  1. “yum install hhvm” コマンドで依存するパッケージを調べる。
  2. 一つ一つのパッケージをインストールしていく。
  3. ソースからHHVMをビルドする。

HHVMは数十のパッケージに依存しています。
この方法ではどうしても
パッケージ間の依存エラーが解決できず、
CentOSにHHVMをインストールすることができませんでした…。

2. Ubuntu上で再度導入を試みたところ成功

CentOSでは上手くHHVMをインストールすることができなかったため、
今度はUbuntu上に開発サーバを移植し、
HHVMを動かすことができるか試みました。

まず、CentOSとして動作している開発サーバを
Ubuntuに移植する所からはじめました。
(数年間運用を続けているソースコードのため、
どうしても依存するパッケージやPHPのモジュールが多く、
移植には一苦労しました…。)

Ubuntuによる開発サーバの構築が完了後、
サーバにHHVMをインストールしました。
インストールは数コマンド叩くだけで完了し、とても簡単でした。
以下にコマンドの例を記載します。

$ sudo apt-get install software-properties-common apt-transport-https
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94

$ sudo add-apt-repository https://dl.hhvm.com/ubuntu
$ sudo apt-get update
$ sudo apt-get install hhvm

具体的なインストール方法は、以下の公式ページをご参照ください。
Hack/HHVM公式 Installation: Linux

また、HHVMをPHP-FPMの代わりに動作させることも簡単でした。
まず、HHVMで用意している以下のスクリプトを実行することで、
Nginx側の設定を変更してくれます。

$ sudo /usr/share/hhvm/install_fastcgi.sh

HHVM自体は、Server modeというモードで動作させればOKです。
例えば、以下のようなコマンドで起動できます。

$ hhvm --mode server -u (ユーザ名)

# デーモンとして起動させたい場合、--mode serverの代わりに以下のコマンドを叩く。
$ hhvm --mode deamon -u (ユーザ名)

また、HHVMのServer mode時の挙動は、
“/etc/hhvm/server.ini”ファイルにまとめることができます。
以下にserver.iniファイルの記載例を掲載します。

; php options

pid = /var/run/hhvm/pid
include_path = ".:/usr/share/php"

; hhvm specific 

hhvm.server.ip = 127.0.0.1
hhvm.server.port = 9000
;TCPではなくUNIXドメインソケットを使いたい場合、以下をコメントインする。
;hhvm.server.file_socket = /var/run/hhvm/sock
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/cache/hhvm/hhvm.hhbc
hhvm.pid_file = /var/run/hhvm/pid/www.pid

実際に環境構築される際は、以下のページを参考にしてみてください。

ここまでの設定は簡単だったものの、
いざHHVM上でゲームを動作させるのが大変でした。
というのも、HHVMはサポートしているExtentionに限りがあり、
PHP上の全てのExtentionが使えるわけではない
からです
(HHVMが対応しているExtentionは、こちらのページにまとまっています)。

弊社タイトルの場合、旧MongoDBドライバ(mongo)
を使っているのがネックになりました。
HHVM上では新ドライバ(mongodb)のみ対応だったので、
そのままではアプリを動作させることができませんでした。

今回は検証が第一目的であったため、
旧MongoDBドライバを使用している箇所を
ダミー実装に置き換えることで解決しました。

3. PHP-FPM(PHP5.6)をHHVMに置き換えた場合のパフォーマンスを比較

上述した作業により、UbuntuサーバによるHHVMの動作環境が完成しました。
次に数画面を適当にピックアップし、
PHP-FPMでの動作環境をHHVMに置き換えた場合、
どの程度パフォーマンスに差が出るのか
を検証しました。

比較条件
  • 同じサーバ上で、HHVM・PHP-FPMを切り替えながら比較
  • プロセス開始 ~ HTML生成前までの処理時間を計測
    (プログラムの速度のみを比較)
  • HHVM・PHP-FPMともに、10回ほどリクエストを実施し
    その平均値を計測
  • ユーザデータによる差異を防ぐため
    同じユーザデータを使用
    (上位ユーザデータのコピー)
  • キャッシュによるノイズを防ぐため
    各種キャッシュ処理は無効にした状態で検証
比較結果
ページ HHVM平均処理時間(sec) PHP-FPM平均処理時間(sec) HHVM平均処理時間
/PHP-FPM平均処理時間(%)
デッキ編成画面 0.310458684 0.47901957 0.648112735
スキル編成画面 0.105403829 0.226790214 0.464763567
ボスバトル画面 0.143286467 0.42578249 0.336525033

3画面でのリクエスト結果を比較した所、上記のような結果となりました。
HHVMの場合、PHP-FPMと比較し2倍以上の速度が出るようです。

※ 個々のリクエスト時のデータは掲載しておりませんが、
HHVMの場合初回リクエストの場合のみ極端に遅く、
2回目以降のリクエスト時に良い数値がでました
(JITコンパイルの影響と思われます)

今回はデッキ編成画面のみ、
PHP-FPM対比で65%程度の速度となっておりますが、
上記初回リクエストの遅延を踏まえると、
リクエストの試行回数を増やせば2倍以上のパフォーマンスが出そうです。

総括

HHVMの導入で検証した内容は以上になります。
要点をまとめると、以下のようになるかと思います。

導入前に確認しておきたいポイント

  • 公式では、HHVMのCentOS版はサポートしていない
    そのため、CentOS上で動作しているWebアプリの場合、
    「ソースからHHVMをビルドする」
    「OSをUbuntuに置き換える」
    などの方法を取る必要がある。
  • HHVMではサポートしていないExtentionも存在する。
    そのため、移行の実作業前に非対応のExtentionを使っているか確認すると良い。

メリット・デメリット

  • メリット
    • プログラムの動作が2倍以上高速化する
      (PHP5.6 -> HHVM)
    • Hackを使用可能。
  • デメリット
    • HHVMは本家PHPと比較してバージョンupの頻度が激しく
      技術的なキャッチアップが必要。
    • HHVMは今後PHP7をサポート対象外とするため、
      公式のPHPと袂を分かち、HHVM/Hackに習熟する覚悟が必要
      (詳細はこちらの記事を参照)。

個人的な所感

上記デメリット欄に掲載したとおり、
「今後HHVMはPHP7を対象外とする」という方針が気になります。
また、PHP7に移行しても、プログラムの速度改善は見込めますし、
使っているユーザ数の多さや情報のヒット率を考えると、
HHVMよりもPHP7の移行に分があるのでは
というのが個人的な意見です。

HHVMを導入するとHackが使えるようになるので、
Hackの機能に魅力を感じられる場合は、
HHVMへの移行を検討しても良いのかもしれません。

また、Ubuntuで動作していて、PHP7への移行が難しいWebアプリの場合
HHVMの導入は一考する価値がある
かと思います。
というのも、Ubuntuの場合、簡単にHHVMをインストールできますし、
プログラムをHackで書き換えさえしなければ、
いざという時にHHVMをPHP-FPMで置き換えるだけで、
元の環境に戻すことができる
ためです。

作者 畑 俊樹

株式会社ORATTAのサーバサイドエンジニア。 PHPでコードを書いてます( ^ω^ )

コメントを残す