WordPress on HHVM

Facebook が開発したPHPを超高速で実行する仮想マシン HipHop VM で WordPress が動く!ってことで AWS で試してみました。
詳細は、以下で

最初 t1.micro インスタンス( 613 MiB メモリ )で試したんですが、以下のメッセージが表示されて起動しません。

# /usr/bin/hhvm --user root --config /etc/hhvm.hdf
tcmalloc: large alloc 1210089472 bytes == (nil) @ 
tcmalloc: large alloc 1210089472 bytes == (nil) @ 
could not allocate 1210089471 bytes for translation cache

メモリ不足とのことなので m1.small インスタンス( 1.7 GiB メモリ )で試してみました。

OS インストール

2015-04-23: 追記 2015年4月より、デジタルキューブが Amazon Linux に Nginx + HHVM 設定済みの AMI を MarketPlace から提供開始しました。
こちらを利用することで、特に難しいことを考えることなく AWS で Nginx + HHVM な WordPress 環境が手に入ります。
AMI セルフホスティングプラン | 超高速 WordPress AMI 網元

quick-launchOS は Ubuntu Server 12.04.1 LTS を選択します。
とりあえず、同一インスタンスで Apache2 の mod_php と比較してみたかったので apt-get で以下のパッケージをインストールしました。

  • apache2
  • mysql-client mysql-common mysql-server
  • php5 libapache2-mod-php5 php5-cli php5-common php5-cgi php5-mysql

HipHop VMのインストール

/etc/apt/sources.list の最下行に deb http://dl.hiphop-php.com/ubuntu precise main を追加して、apt-get install するだけだそうです。
ラクチンですね。

$ sudo apt-get update
$ sudo apt-get install hiphop-php

この後、設定ファイルを書いて

$ sudo vi /etc/hhvm.hdf
Server {
  Port = 80
  SourceRoot = /var/www/
}

Eval {
  Jit = true
}
Log {
  Level = Error
  UseLogFile = true
  File = /var/log/hhvm/error.log
  Access {
    * {
      File = /var/log/hhvm/access.log
      Format = %h %l %u %t \"%r\" %>s %b
    }
  }
}

VirtualHost {
  * {
    Pattern = .*
    RewriteRules {
      dirindex {
        pattern = ^/(.*)/$
        to = $1/index.php
        qsa = true
      }
    }
  }
}

StaticFile {
  FilesMatch {
    * {
      pattern = .*\.(dll|exe)
      headers {
        * = Content-Disposition: attachment
      }
    }
  }
  Extensions {
    css = text/css
    gif = image/gif
    html = text/html
    jpe = image/jpeg
    jpeg = image/jpeg
    jpg = image/jpeg
    png = image/png
    tif = image/tiff
    tiff = image/tiff
    txt = text/plain
  }
}

ログファイル用ディレクトリ( /var/log/hhvm/ )を作成して起動しましょう。
(Apache が起動している場合は /etc/init.d/apache2 stop) で停止しておいてね。

$ sudo mkdir /var/log/hhvm/
$ sudo /usr/bin/hhvm --mode daemon --user root --config /etc/hhvm.hdf
$ sudo ps -ef | grep hhvm | grep -v grep
root      1317     1  8 08:58 ?        00:00:22 /usr/bin/hhvm --mode daemon --user root --config /etc/hhvm.hdf

WordPress のインストール

普通にインストールしましょう。
ただし、コアハックが必要です。
2015-04-23: 追記 現在のバージョンの HHVM と WordPress の組み合わせでは、コアハックは必要ありません。

wp-includes/wp-db.php


問題点

とりあえず、メディアアップロードができないっす。
メディアアップロードしようとすると、以下のようなエラーが発生します。残念 ><

HipHop Fatal error: f_stream_get_wrappers is not going to be supported: stream protocol is not supported in /var/www/wp/wp-includes/functions.php on line 3830

WP Importer プラグインを有効化しようとしても、同じエラーが発生します。
2015-04-23: 追記 現在のバージョンの HHVM と WordPress の組み合わせでは、この問題は発生しません。
普通にメディアアップロードできます。

その他は、特に問題無さそう。
WP のインストール、ダッシュボードからプラグインインストールしたり、有効化したり、テーマ変更したりは問題無くできました。

パフォーマンス

ネットワークでのボトルネックを排除するため、Theme Unit Test データをインポートした WP 3.5 サイトに同一サーバ上から ab -n 100 -c 10 してみました。

hhvm

Server Software:        
Server Hostname:        ec2-176-34-9-3.ap-northeast-1.compute.amazonaws.com
Server Port:            80

Document Path:          /wp/
Document Length:        43314 bytes

Concurrency Level:      10
Time taken for tests:   15.549 seconds
Complete requests:      100
Failed requests:        0
   (Connect: 0, Receive: 0, Length: 0, Exceptions: 0)
Write errors:           0
Total transferred:      4350088 bytes
HTML transferred:       4331288 bytes
Requests per second:    6.43 [#/sec] (mean)
Time per request:       1554.926 [ms] (mean)
Time per request:       155.493 [ms] (mean, across all concurrent requests)
Transfer rate:          273.20 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2  12.1      0     120
Processing:   604 1525 461.4   1480    2909
Waiting:      604 1504 466.3   1459    2907
Total:        604 1527 460.0   1480    2909

apache

Server Software:        Apache/2.2.22
Server Hostname:        ec2-176-34-9-3.ap-northeast-1.compute.amazonaws.com
Server Port:            80

Document Path:          /wp/
Document Length:        43312 bytes

Concurrency Level:      10
Time taken for tests:   76.037 seconds
Complete requests:      100
Failed requests:        0
   (Connect: 0, Receive: 0, Length: 0, Exceptions: 0)
Write errors:           0
Total transferred:      4360569 bytes
HTML transferred:       4331269 bytes
Requests per second:    1.32 [#/sec] (mean)
Time per request:       7603.658 [ms] (mean)
Time per request:       760.366 [ms] (mean, across all concurrent requests)
Transfer rate:          56.00 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   5.2      0      48
Processing:  4733 7453 1636.0   7120   12143
Waiting:     2757 4929 1231.1   4706    8438
Total:       4733 7454 1635.9   7120   12143

約5倍くらい速いっすね。ただ、メディアアップロードできないのが残念だなぁ

コメントを残す

メールアドレスが公開されることはありません。