エンタープライズ用途での利用が増えている「WordPress」の高速化チューニングテクニックを解説する本連載。今回は「1000倍高速化」を目指すチューングテクニックの第三弾として、「HHVMを導入してチューニングする」方法を紹介します。
前回は、PHP実行環境を、PHP 5比で2倍以上のパフォーマンス向上をもたらすとされる「PHP 7」に変更し、チューニングをしない初期状態から「約12.5倍」までWordPressを高速化できました。
今回は、フェイスブックが開発するPHP互換の実行環境で、PHP処理系の1つである「HHVM(HipHop Virtual Machine)」を導入して高速化するチューニングテクニックを解説します。
まず、本テクニックはこれまで解説してきたチューニングの続きとなるので、この記事からご覧の方は、連載バックナンバーから、「約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」(HipHop Virtual Machine)は、米フェイスブックが開発するPHP互換の実行環境でPHP処理系の1つです。特徴として、PHP 5.6やPHP 7で導入したOPCacheやAPCu互換のバイトコードに関する機能の他、JITコンパイラを有しており、何度も実行される部分を実行時にコンパイルしてCPUが直接理解できるネイティブコードとして実行する機能があります。
PHP 5やPHP 7は、PHPのソースコードを一度バイトコードに変換して、バイトコードをPHP仮想マシンが実行する形式です。このバイトコードをキャッシュして高速化を実現するのが、OPCacheやAPCなどの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
修正が済んだら、修正後の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
Copyright © ITmedia, Inc. All Rights Reserved.