連載
» 2016年04月26日 05時00分 UPDATE

とにかく速いWordPress(7):「WordPress“1000倍”高速化」チューニング 第三弾──「HHVM(HipHop Virtual Machine)」を導入する (1/2)

エンタープライズ用途での利用が増えている「WordPress」の高速化チューニングテクニックを解説する本連載。今回は「1000倍高速化」を目指すチューングテクニックの第三弾として、「HHVMを導入してチューニングする」方法を紹介します。

[中村けん牛,プライム・ストラテジー]
backn2.gif

連載バックナンバー

 前回は、PHP実行環境を、PHP 5比で2倍以上のパフォーマンス向上をもたらすとされる「PHP 7」に変更し、チューニングをしない初期状態から「約12.5倍」までWordPressを高速化できました。

 今回は、フェイスブックが開発するPHP互換の実行環境で、PHP処理系の1つである「HHVM(HipHop Virtual Machine)」を導入して高速化するチューニングテクニックを解説します。

photo WordPressの日本語ローカルサイト

 まず、本テクニックはこれまで解説してきたチューニングの続きとなるので、この記事からご覧の方は、連載バックナンバーから、「約12.5倍」まで高速化チューニングを済ませておいてください。

チューニング内容 ページのロード時間
(デフォルト環境比)
1秒当たりの同時アクセス数
「Requests per second」(デフォルト環境比)
デフォルト環境 176ms 11.24
APCの導入
 チューニング方法をおさらい
70ms(約251%) 29.20
OPcache+APCuを導入
 チューニング方法をおさらい
66ms(約266%) 30.51
MariaDBの設定を調整
 チューニング方法をおさらい
64ms(約275%) 31.82
翻訳アクセラレータを導入(キャッシュ)
 チューニング方法をおさらい
53ms(約332%) 39.29
翻訳アクセラレータを導入(翻訳を停止)
 チューニング方法をおさらい
36ms(約488%) 56.78
gzip圧縮を用いる
 チューニング方法をおさらい
35ms(約502%)
Tunedの調整
 チューニング方法をおさらい
34ms(約517%) 58.47
event MPM+php-fpm構成に変更
 チューニング方法をおさらい
33ms(約537%) 60.79
PHP 5.6+OPCache+APCuを導入
 チューニング方法をおさらい
32ms(約550%) 61.84(約550.2%)
PHP 7+OPCache+APCuを導入
 チューニング方法をおさらい
18ms(約977.7%) 148.08(約1250.6%)

HHVMを導入する

 「HHVM」(HipHop Virtual Machine)は、米フェイスブックが開発するPHP互換の実行環境でPHP処理系の1つです。特徴として、PHP 5.6やPHP 7で導入したOPCacheやAPCu互換のバイトコードに関する機能の他、JITコンパイラを有しており、何度も実行される部分を実行時にコンパイルしてCPUが直接理解できるネイティブコードとして実行する機能があります。

photo 「HHVM」の紹介サイト

 PHP 5やPHP 7は、PHPのソースコードを一度バイトコードに変換して、バイトコードをPHP仮想マシンが実行する形式です。このバイトコードをキャッシュして高速化を実現するのが、OPCacheAPCなどのPHPアクセラレータです。

 それに対して、HHVMは何が違うのでしょう。PHPのソースコードを一度バイトコードに変換して、そのキャッシュを保持するまでは同じですが、さらに「何度も利用される部分を実行時にネイティブコードに変換して実行する」のが大きく異なります。

 このため、HHVMはバイトコードのキャッシュと、JITコンパイルという二段階の処理が走ります。初回のアクセスからしばらくの間は、PHP 5やPHP 7よりもパフォーマンスは上がりませんが、しばらくしてJITコンパイルが進み“暖まった状態”になると、高速に動作するようになります。この特性は、平常の運用時ではあまり問題はなりませんが、HHVMの初回起動時や再起動時はパフォーマンスが落ちてしまうので注意する必要があります。

 また、HHVMはPHP 5やPHP 7との高い互換性を有していますが、全ての機能やモジュールに完全な互換性があるわけではありません。特にテーマやプラグインによっては互換性を確保するための修正が必要なものがあります。運用においては、このことも念頭に置いておいてください。

 それでは、HHVMを導入していきましょう。今回は、GitHub内Facebook/HHVMコミュニティーのWikiに記載されている「Building and installing hhvm on CentOS 7.x」を参考に、RPMパッケージから「HHVM 3.12」をインストールします。今回の例でインストールするHHVM 3.12は、RemiリポジトリからインストールしたPHP 7もしくはPHP 5.6との共存が可能です。

 まず、HHVMのインストールに必要なパッケージを先にそろえます。

[root@ip ~]# yum update -y
[root@ip ~]# 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 {fribidi,libc-client}-devel make -y
[root@ip ~]# yum install inotify-tools -y

 上記サイトの手順ではEPELリポジトリを導入するパートがありますが、ここでは既に導入済みですので割愛します。また、依存ライブラリが1つ足りないので、上記のコマンドでは「inotify-tools」パッケージを追加でインストールしています。

 続いてHHVM 3.12をインストールします。

[root@ip ~]# rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.12.0-1.el7.centos.x86_64.rpm

 これで、HHVM 3.12のインストールは完了です。次のコマンドで正しくインストールされているかを確認します。

[root@ip ~]# hhvm --version
HipHop VM 3.12.0 (rel)
Compiler: tags/HHVM-3.12.0-0-g440e6a096b2db8a449b9690a72f2f1792530e86a
Repo schema: 033b8dedf4af99b892f2488b103a8d67a58ff816
ステータス確認のコマンドと表示内容

 systemdとHHVMの設定ファイルの一部を修正します。HHVMの待ち受けのポート番号を、9001番から「9000番」に変更し、タイムゾーンを設定します。

 まず、systemdのHHVMのserviceファイルを優先ディレクトリにコピーします。

[root@ip ~]# cp -p /usr/lib/systemd/system/hhvm.service /etc/systemd/system/

 コピーしたserviceファイルの[Service]ディレクティブから、ポート番号の指定を削除します。以下のように修正します。

[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)
[Service]
ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi
[Install]
WantedBy=multi-user.target
/etc/systemd/system/hhvm.service
リスト:「/etc/systemd/system/hhvm.service」の修正箇所(4行目)

 修正が済んだら、修正後のserviceファイルをsystemdに認識させます。

[root@ip ~]# systemctl daemon-reload

 次に、HHVMの設定ファイルを修正します。「/etc/hhvm/server.ini」を以下のように修正します。

; php options
;pid = /var/log/hhvm/pid
; hhvm specific 
hhvm.pid_file = "/var/log/hhvm/pid"
hhvm.server.port = 9000
hhvm.server.type = fastcgi
(略)
[date]
date.timezone = UTC
default_socket_timeout = 120
memory_limit = 256M
リスト:「/etc/hhvm/server.ini」の修正箇所(5行目、9行目)
       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。