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つの計測サイトでの結果がもっと改善していました。
データベースまわりの設定も見直したいですね。
以上です。