純規の暇人趣味ブログ

首を突っ込んで足を洗う

Ubuntu+PHP7-FPM(sock)+Apache(event)の高速環境を試す。

      2016/02/20    HimaJyun

超サイヤ人ゴッド超サイヤ人(通称->SSGSS)への進化を遂げたかの如く高速化を果たしたPHP7
HHVMにも勝るその速度を味わってみたい。

と言う訳で、Ubuntu+PHP7-FPM(UNIXSocket)+Apache(event)と言う、現時点では割と異色の組み合わせを試してみようと思います。(CentOS+PHP7-FPM(TCP)+Nginxの組み合わせはいくらでもあったんだけど、今回の組み合わせは見つからなかったので)

基本的にphp5のfpmと同じなので、先にApacheをpreforkからeventに切り替えるを読んで頂ければ分かりやすいかも

PHP7のインストール

現時点(2015/12/12)でUbuntuの公式レポにはPHP7は追加されていないため、レポを追加してインストールします。
公式レポ版とは微妙にやり方が異なるかも知れません。

レポを追加してサクッとインストールしてやる

sudo add-apt-repository ppa:ondrej/php-7.0

sudo apt-get update

sudo apt-get install php7.0-fpm php7.0-curl php7.0-mysql php7.0-readline php7.0-sqlite php7.0-bz2 php-gd php-apcu php-imagick

各種モジュールはLAMPインストールのPHPで実行したphpinfoを参考にしました、お好みに合わせて調整して下さい。
ちなみに、mod_phpの7版は「libapache2-mod-php7.0」ですけど、今回は扱いません。

FastCGIに対応

もしも、mod_php環境の場合は先へと進む前にFastCGIに対応するために以下の作業を

sudo apt-get install libapache2-mod-fastcgi

sudo a2enmod actions fastcgi

sudo a2dismod php5

PHP-FPMを有効に

エディタで「/etc/apache2/mods-available/fastcgi.conf」を開いて以下の内容を追記するだけ

AddHandler php7.0-fcgi .php
Action php7.0-fcgi /php7.0-fcgi
Alias /php7.0-fcgi /usr/sbin/php-fpm7.0
FastCgiExternalServer /usr/sbin/php-fpm7.0 -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization

<Directory /usr/sbin>
  <Files php-fpm7.0>
   Require all granted
  </Files>
</Directory>

編集後は以下の様になると思われ

<IfModule mod_fastcgi.c>
 AddHandler fastcgi-script .fcgi
 #FastCgiWrapper /usr/lib/apache2/suexec
 FastCgiIpcDir /var/lib/apache2/fastcgi

 AddHandler php7.0-fcgi .php
 Action php7.0-fcgi /php7.0-fcgi
 Alias /php7.0-fcgi /usr/sbin/php-fpm7.0
 FastCgiExternalServer /usr/sbin/php-fpm7.0 -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization

 <Directory /usr/sbin>
  <Files php-fpm7.0>
   Require all granted
  </Files>
 </Directory>
</IfModule>

後はApacheとPHP-FPMを再起動してPHP7のFPMは出来上がり

sudo service apache2 restart

sudo service php7.0-fpm restart

ではあるのですが、せっかくFPMに切り替えたのですし、mpm_eventを利用しないともったいないです。

Apacheをmpm_eventに切り替え

簡単3ステップ

sudo apt-get install apache2-mpm-event

sudo a2dismod mpm_prefork

sudo a2enmod mpm_event

ついでなのでより新しい版に更新する

現時点(2015/12/12)でApache2をインストールすると入る最新版は「2.4.7」、利用可能な最新版は「2.4.17」なのでちょい古め?

そのため、ここでもレポを追加してApacheを更新しようと思います。

sudo add-apt-repository ppa:ondrej/apache2

sudo apt-get update

sudo apt-get dist-upgrade

これでより新しいバージョンへとアップグレードされると思います。
バージョンの確認は「apache2ctl -v」、現時点で最新の2.4.17が入った模様

Server version: Apache/2.4.17 (Ubuntu)
Server built: 2015-11-05T00:00:00

測定してみる

せっかくなので「HHVM並に速い」と言うのが本当か試してみようと思います。

環境は自分のPC上のVirtualBoxに構築した以下の環境に、

  • UbuntuServer 14.04.3LTS
  • 4Core
  • 8G Mem
  • Apache/2.4.7(mpm_event)
  • MySQL/5.5.46
  • OPcacheを有効化

測定対象としては「良くある例」を再現するために以下の3点で、

トップページをApacheBenchで1000アクセスを100接続で測定。

セットアップ済みのWordPressは以下の様な感じ
ubuntu-php7-apache_001

php5-fpm

Concurrency Level: 100
Time taken for tests: 43.877 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 47101000 bytes
HTML transferred: 46832000 bytes
Requests per second: 22.79 [#/sec] (mean)
Time per request: 4387.709 [ms] (mean)
Time per request: 43.877 [ms] (mean, across all concurrent requests)
Transfer rate: 1048.32 [Kbytes/sec] received

Connection Times (ms)
 min mean[+/-sd] median max
Connect: 0 1 1.2 1 8
Processing: 226 4178 726.9 4369 4662
Waiting: 163 4097 725.2 4289 4567
Total: 230 4179 726.0 4369 4667

Percentage of the requests served within a certain time (ms)
 50% 4369
 66% 4397
 75% 4419
 80% 4432
 90% 4470
 95% 4500
 98% 4538
 99% 4564
 100% 4667 (longest request)

まぁまぁ、ぼちぼち、普通かな?って所ですね。
ほぼ無チューニングなのでそこを調整すれば30~35req/sほど行けますね(実験済み)

HHVM

先程の環境からPHPを抜いてHHVM(3.11.0)に入れ替え

Concurrency Level: 100
Time taken for tests: 13.938 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 47091000 bytes
HTML transferred: 46832000 bytes
Requests per second: 71.75 [#/sec] (mean)
Time per request: 1393.794 [ms] (mean)
Time per request: 13.938 [ms] (mean, across all concurrent requests)
Transfer rate: 3299.43 [Kbytes/sec] received

Connection Times (ms)
 min mean[+/-sd] median max
Connect: 0 2 2.4 1 35
Processing: 104 1326 225.3 1383 1607
Waiting: 100 1322 225.7 1379 1606
Total: 109 1327 224.4 1384 1609

Percentage of the requests served within a certain time (ms)
 50% 1384
 66% 1399
 75% 1407
 80% 1411
 90% 1427
 95% 1439
 98% 1458
 99% 1480
 100% 1609 (longest request)

流石はHHVMと言った所、先程の環境と比べて3倍以上の高速化に成功。

php7-fpm

さて、本命PHP7、今回紹介した方法でセットアップ(Apacheは公平性のために2.4.7のままで)

Concurrency Level: 100
Time taken for tests: 14.797 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 47064000 bytes
HTML transferred: 46832000 bytes
Requests per second: 67.58 [#/sec] (mean)
Time per request: 1479.668 [ms] (mean)
Time per request: 14.797 [ms] (mean, across all concurrent requests)
Transfer rate: 3106.17 [Kbytes/sec] received

Connection Times (ms)
 min mean[+/-sd] median max
Connect: 0 2 3.0 1 12
Processing: 109 1406 221.8 1450 1673
Waiting: 108 1382 220.3 1425 1638
Total: 120 1408 219.6 1451 1682

Percentage of the requests served within a certain time (ms)
 50% 1451
 66% 1473
 75% 1491
 80% 1503
 90% 1527
 95% 1546
 98% 1565
 99% 1580
 100% 1682 (longest request)

あぁ……、惜しい!!
あと一歩の所でHHVMに及ばずです。

しかし、それでも元より3倍ほど速いです。
HHVMの様なウォーミングアップを必要としないので妥当どころか十分すぎる程でしょう。

三者共通の事ですが、最適なチューニングを施せばもっと素晴らしい結果を引き出せると思います。
もっと本気でやってほしいな、ってね。

今回はテストと言う事で仮想環境に構築しましたが、このサイトを動かしているサーバも速く乗り換えたいですね。

 - サーバ運営 , ,