CentOS7 + Apache 2.4 + PHP 7.4 + APCu、OPcacheの速度結果

Icon PHP

APCu、OPcacheはPHPのキャッシュ機能です。

インストールしていない状態だとアクセスの都度、PHPを読込・実行という流れになりますが、上記を導入することで最適化した状態でPHPプログラムがキャッシュされ、2度目以降のアクセスでは応答速度の改善が期待できる…というもの。

インストール、設定、導入前後のApache Benchの結果を載せます。

インストール

以下のコマンドで実行。
PHP 7.4(現時点での最新は7.4.13)は、remiレポジトリにあるので、そこを参照します。

$ yum install --enablerepo=epel, remi, remi-php74 php-opcache php-pecl-apcu

設定ファイルを修正

/ect/php.d/の下に、

  • xx-apcu.ini
  • xx-opcache.ini

というファイルがあります(xxは数字)。

xx-apcu.iniは以下のようにしました。

apc.shm_size=64M
apc.ttl=86400
apc.gc_ttl=86400

OPcacheの設定は以下のように。

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000

httpdを再起動します。

$ sudo systemctl restart httpd

検証結果

Appache Benchで検証してみます。指定したURLに対し、同時接続数とリクエスト回数を指定してGETリクエストを発行し、パフォーマンスが計測できるものです(HEADリクエストもオプションで指定できる)。

導入前

同時接続10、リクエスト100で実行してみます。

$ ab -n 100 -c 10 https://mat0401.info/

結果は以下。

$ ab -n 100 -c 10 https://mat0401.info/

This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking mat0401.info (be patient).....done


Server Software:        Apache
Server Hostname:        mat0401.info
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
TLS Server Name:        mat0401.info

Document Path:          /
Document Length:        164746 bytes

Concurrency Level:      10
Time taken for tests:   14.725 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      16497100 bytes
HTML transferred:       16474600 bytes
Requests per second:    6.79 [#/sec] (mean)
Time per request:       1472.486 [ms] (mean)
Time per request:       147.249 [ms] (mean, across all concurrent requests)
Transfer rate:          1094.10 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      108  165  78.1    142     494
Processing:   629 1170 323.9   1108    2469
Waiting:      324  517 155.4    470     869
Total:        769 1335 349.0   1266    2621

Percentage of the requests served within a certain time (ms)
  50%   1266
  66%   1404
  75%   1518
  80%   1634
  90%   1800
  95%   2033
  98%   2361
  99%   2621
 100%   2621 (longest request)

APCu、OPcache適用後

Requests per second、Time per request、一番最後の全リクエストの処理完了経過時間ともに改善していますね…。

$ ab -n 100 -c 10 https://mat0401.info/

This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking mat0401.info (be patient).....done


Server Software:        Apache
Server Hostname:        mat0401.info
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
TLS Server Name:        mat0401.info

Document Path:          /
Document Length:        164746 bytes

Concurrency Level:      10
Time taken for tests:   5.154 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      16497100 bytes
HTML transferred:       16474600 bytes
Requests per second:    19.40 [#/sec] (mean)
Time per request:       515.404 [ms] (mean)
Time per request:       51.540 [ms] (mean, across all concurrent requests)
Transfer rate:          3125.79 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      100  112   7.9    111     147
Processing:   266  364  60.1    368     557
Waiting:      166  257  54.5    267     414
Total:        374  476  62.5    478     690

Percentage of the requests served within a certain time (ms)
  50%    478
  66%    500
  75%    510
  80%    519
  90%    558
  95%    593
  98%    620
  99%    690
 100%    690 (longest request)

PHP FPM (Fast CGI)を使用した場合も検証してみた

上記のキャッシュに加え、Apache + PHP FPMを使用した場合です。受け渡しにはsocketを指定。

何も導入していない状態に比べれば多少良いですが、モジュール版PHPを使用した場合(上の場合)に比べ、結果が劣ります。ちなみに、何回か計測しましたが、同様の結果でした。

$ ab -n 100 -c 10 https://mat0401.info/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking mat0401.info (be patient).....done


Server Software:        Apache
Server Hostname:        mat0401.info
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
TLS Server Name:        mat0401.info

Document Path:          /
Document Length:        164746 bytes

Concurrency Level:      10
Time taken for tests:   13.768 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      16497100 bytes
HTML transferred:       16474600 bytes
Requests per second:    7.26 [#/sec] (mean)
Time per request:       1376.830 [ms] (mean)
Time per request:       137.683 [ms] (mean, across all concurrent requests)
Transfer rate:          1170.11 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      100  113  29.4    109     391
Processing:   477 1174 173.0   1148    1458
Waiting:      156  836 180.1    813    1114
Total:        604 1287 177.1   1253    1647

Percentage of the requests served within a certain time (ms)
  50%   1253
  66%   1398
  75%   1433
  80%   1450
  90%   1516
  95%   1545
  98%   1576
  99%   1647
 100%   1647 (longest request)

モジュール版PHPに比べるとPHP FPM(Fast CGI)のほうがパフォーマンス面では劣る、というのはググればよく出てくると思います。

httpdとは別プロセスになるのと、受け渡しのオーバーヘッドが発生するからでしょうかね。ちなみに、socket方式はTCP層での通信ですが「http://127.0.0.1:9000」だとHTTP層での通信になるので、原理的には前者のほうがパフォーマンスが良いように思えます。でも、モジュール版のほうが結果が良いですね。

ちなみに、GoogleのPageSpeed Insightsや、Web Page Testでも結果が改善されていました。加えて、コンテンツ圧縮(データをgzip圧縮ファイルで送る方法)、キャッシュの期間指定の設定も実施しましたが、この2つの計測サイトでの結果がもっと改善していました。

データベースまわりの設定も見直したいですね。

以上です。