WordPressサーバーの高速化(効果大)OPcacheとAPCuでWordPressの速度を5倍以上に向上させる。
今回は、前回の記事
>「WordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。」
で作成したphp-fpmが動作する環境を利用して、更にWordPressを高速化するためのphp用パッケージであるOPcacheとAPCuを導入します。OPcacheとapcuはPHPアクセラレータと呼ばれるphpを高速化させるためのソフトウェアです。OPcacheはコンパイルしたphpのコードをメモリに保存しておく仕組みで、アクセス毎のスクリプト読み込みを回避します。APCuも同じくキャッシュを行うソフトウェアになり、こちらはコードではなくデータをキャッシュ(共有メモリにデータを保存する)します。
スポンサーリンク
纏めると
- OPcache … コンパイルしたコードをキャッシュ
- APCu … データのキャッシュ
という機能を提供します。
前回の記事「WordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。」では、多少ですがパフォーマンスが向上しましたが、大きくは変わっていません。今回はキャッシュ用のソフトウェアになることから大幅なパフォーマンス向上が期待できます。WordPressやPHPを利用しているサイトの高速化に、是非、試して頂きたい方法です。
目次
1.OPcacheとapcuを導入する環境
opcacheとapcuをインストールする環境はphp-fpmの導入手順を紹介した記事「WordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。」で紹介していますが、確認の意味で再度纏めておきます。基本的な環境は以下の通りです。
- OSのバージョンはCentOSで最新(2018年5月現在)のバージョン7.5を利用しています。
- ウェブサーバーとしてApache2.4.6がインストールされています。
- Apacheは基本的な設定が完了して、テストページが表示されています。
- ApacheはHTTPS通信に対応した設定が完了しています。
- ApacheはMPMとしてeventMPMが設定されています。
- PHP 7.2系をインストールしており、テストページまで表示されています。
- php-fpm7.2系をインストールしており、fastCGI版のphpが動作しています。
- MariaDBは10系(10.2)をインストールしており、最低限の設定を行っています。
- WordPressがインストールされています。
- サーバーはインターネットへ接続されており、グローバルIPアドレスが一つ、割り当てられています。
- ファイアウォールとしてfirewalldを設定しています。
この環境を前提にOPcacheとAPCuのインストールを進めていきます。インストールするOPcacheとAPCuは以前の記事と同様に7.2系を利用します。(2018年6月時点では7.2.6)
2.OPcacheインストール前のphp情報を確認
現状のphpについて情報を確認します。OPcacheをインストールすると、”php -v”実行結果の”Zend Engine”の部分が変更されます。先ずはインストールを行う前に出力内容を確認しておきます。
1 2 3 4 | $ php -v PHP 7.2.6 (cli) (built: May 23 2018 09:50:51) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies |
上記のようにバージョンが表示されれば、phpの情報確認は完了です。この時点ではOPcacheに関する情報は表示されていないことを覚えておきます。
3.OPcacheとAPCuパッケージのインストール
インストールするパッケージの情報が確認できましたので、ここからは実際にOPcacheとAPCuの導入について説明を行います。
3-1.OPcacheとAPCuパッケージ情報の確認
OPcacheとAPCuパッケージのインストール前に、パッケージの情報を確認しておきます。php7.2系のOPcacheとAPCuはremiレポジトリに含まれるため、確認コマンドの実行時にremiレポジトリを参照するように指定します。パッケージ名は
- OPcache … php-opcache
- APCu … php-pecl-apcu
になります。以下のようにyumを実行します。
1 | $ yum info --enablerepo=remi,remi-php72 php-opcache php-pecl-apcu |
実行結果は以下の通りです。各パッケージの役割などを確認しておくと、インストールするパッケージの意味合いをイメージしやすいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile * base: ftp.jaist.ac.jp * epel: mirror.dmmlabs.jp * extras: ftp.jaist.ac.jp * remi: mirror.bebout.net * remi-php72: mirror.bebout.net * remi-safe: mirror.bebout.net * updates: ftp.jaist.ac.jp 利用可能なパッケージ 名前 : php-opcache アーキテクチャー : x86_64 バージョン : 7.2.6 リリース : 1.el7.remi 容量 : 279 k リポジトリー : remi-php72 要約 : The Zend OPcache URL : http://www.php.net/ ライセンス : PHP 説明 : The Zend OPcache provides faster PHP execution through opcode caching and : optimization. It improves PHP performance by storing precompiled script : bytecode in the shared memory. This eliminates the stages of reading code from : the disk and compiling it on future access. In addition, it applies a few : bytecode optimization patterns that make code execution faster. 名前 : php-pecl-apcu アーキテクチャー : x86_64 バージョン : 5.1.11 リリース : 1.el7.remi.7.2 容量 : 75 k リポジトリー : remi-php72 要約 : APC User Cache URL : http://pecl.php.net/package/APCu ライセンス : PHP 説明 : APCu is userland caching: APC stripped of opcode caching. : : APCu only supports userland caching of variables. : : The php-pecl-apcu-bc package provides a drop : in replacement for APC. : : Package built for PHP 7.2. |
上記のように7.2系のOPcacheとAPCuが表示されることが確認できました。この2パッケージをインストールしていきます。
3-2.OPcacheとAPCuパッケージのインストール
パッケージはyumコマンドにinstallオプションを付けることでインストールすることができます。項目3-1.で必要なパッケージの情報が確認できましたので、以下のコマンドでインストールします。
1 | # yum -y install --enablerepo=remi,remi-php72 php-opcache php-pecl-apcu |
上記ではyumコマンドに”-y”オプションを付けることでインストール時の確認応答を省いています。コマンドを実行すると、以下のようにインストールが開始されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.cat.net * epel: mirror.dmmlabs.jp * extras: mirrors.cat.net * remi: mirror.bebout.net * remi-php72: mirror.bebout.net * remi-safe: mirror.bebout.net * updates: mirrors.cat.net 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ php-opcache.x86_64 0:7.2.6-1.el7.remi を インストール ---> パッケージ php-pecl-apcu.x86_64 0:5.1.11-1.el7.remi.7.2 を インストール --> 依存性解決を終了しました。 依存性を解決しました ======================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量 ======================================================================================================================== インストール中: php-opcache x86_64 7.2.6-1.el7.remi remi-php72 279 k php-pecl-apcu x86_64 5.1.11-1.el7.remi.7.2 remi-php72 75 k トランザクションの要約 ======================================================================================================================== インストール 2 パッケージ 総ダウンロード容量: 355 k インストール容量: 1.1 M Downloading packages: (1/2): php-pecl-apcu-5.1.11-1.el7.remi.7.2.x86_64.rpm | 75 kB 00:00:01 (2/2): php-opcache-7.2.6-1.el7.remi.x86_64.rpm | 279 kB 00:00:02 ------------------------------------------------------------------------------------------------------------------------ 合計 168 kB/s | 355 kB 00:00:02 Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : php-pecl-apcu-5.1.11-1.el7.remi.7.2.x86_64 1/2 インストール中 : php-opcache-7.2.6-1.el7.remi.x86_64 2/2 検証中 : php-opcache-7.2.6-1.el7.remi.x86_64 1/2 検証中 : php-pecl-apcu-5.1.11-1.el7.remi.7.2.x86_64 2/2 インストール: php-opcache.x86_64 0:7.2.6-1.el7.remi php-pecl-apcu.x86_64 0:5.1.11-1.el7.remi.7.2 完了しました! |
エラーがなく、”完了しました!”と表示されればOPcacheとAPCuパッケージのインストールは完了です。
3-3.インストールしたパッケージの確認
OPcacheがインストールされたことを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、OPcacheパッケージがインストールされていることを確認します。
1 | $ yum list installed | grep php-opcache |
出力結果として、以下のOPcacheパッケージが表示されることを確認します。
1 | php-opcache.x86_64 7.2.6-1.el7.remi @remi-php72 |
次にAPCuパッケージがインストールされたことを確認します。同じくyumで確認を行います。
1 | $ yum list installed | grep php-pecl-apcu |
出力結果として、以下のAPCuパッケージが表示されることを確認します。
1 | php-pecl-apcu.x86_64 5.1.11-1.el7.remi.7.2 @remi-php72 |
これでインストールしたパッケージの確認は完了です。
スポンサーリンク
4.phpコマンドによるOPcacheとAPCuの確認
パッケージのインストールと確認まで完了しましたので、ここからはphpコマンド利用して、OPCacheとAPCuが有効になっていることを確認します。
4-1.OPcacheの確認
OPcacheが動作しているかの確認はphpコマンドに-vを付けて実行します。以下のような結果になります。
1 2 3 4 5 | $ php -v PHP 7.2.6 (cli) (built: May 23 2018 09:50:51) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.6, Copyright (c) 1999-2018, by Zend Technologies |
項目2.では Zend Engineと表示されていた部分が”Zend OPcache”に変更されていることが確認できます。
4-2.APCuとOPcacheの設定確認
続いて、APCuとOPcacheの設定を確認します。phpコマンドに”-i”を付与して実行します。-iを付与することでphpの情報を出力することができます。ここでは設定確認として、出力された情報に含まれる文字列”apc”と”opcache”のみを抽出します。以下のように実行します。
1 | $ php -i | egrep 'apc|opcache' |
出力結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | Additional .ini files parsed => /etc/php.d/10-opcache.ini, /etc/php.d/40-apcu.ini, apcu MMAP File Mask => /tmp/apc.XXXXXX apc.coredump_unmap => Off => Off apc.enable_cli => Off => Off apc.enabled => On => On apc.entries_hint => 4096 => 4096 apc.gc_ttl => 3600 => 3600 apc.mmap_file_mask => /tmp/apc.XXXXXX => /tmp/apc.XXXXXX apc.preload_path => no value => no value apc.serializer => php => php apc.shm_segments => 1 => 1 apc.shm_size => 32M => 32M apc.slam_defense => On => On apc.smart => 0 => 0 apc.ttl => 0 => 0 apc.use_request_time => On => On apc.writable => /tmp => /tmp opcache.blacklist_filename => /etc/php.d/opcache*.blacklist => /etc/php.d/opcache*.blacklist opcache.consistency_checks => 0 => 0 opcache.dups_fix => Off => Off opcache.enable => On => On opcache.enable_cli => Off => Off opcache.enable_file_override => Off => Off opcache.error_log => no value => no value opcache.file_cache => no value => no value opcache.file_cache_consistency_checks => 1 => 1 opcache.file_cache_only => 0 => 0 opcache.file_update_protection => 2 => 2 opcache.force_restart_timeout => 180 => 180 opcache.huge_code_pages => On => On opcache.inherited_hack => On => On opcache.interned_strings_buffer => 8 => 8 opcache.lockfile_path => /tmp => /tmp opcache.log_verbosity_level => 1 => 1 opcache.max_accelerated_files => 4000 => 4000 opcache.max_file_size => 0 => 0 opcache.max_wasted_percentage => 5 => 5 opcache.memory_consumption => 128 => 128 opcache.opt_debug_level => 0 => 0 opcache.optimization_level => 0x7FFFBFFF => 0x7FFFBFFF opcache.preferred_memory_model => no value => no value opcache.protect_memory => 0 => 0 opcache.restrict_api => no value => no value opcache.revalidate_freq => 2 => 2 opcache.revalidate_path => Off => Off opcache.save_comments => 1 => 1 opcache.use_cwd => On => On opcache.validate_permission => Off => Off opcache.validate_root => Off => Off opcache.validate_timestamps => On => On |
上記からphpにOPcacheとAPCuが組み込まれていることが確認できました。本パラメータは運用環境に合わせて変更することで、よりパフォーマンスを引き出すことが出来ますが、デフォルトでも十分にパフォーマンスは向上しますので、変更は行わない前提です。これでphpコマンドによるOPcacheとAPCuの確認は完了です。
5.OPcacheとAPCuの有効化
項目4.まででOPcacheとAPCuの導入が完了しましたので、機能を有効化する手順を説明します。
5-1.php-fpmの再起動
OPcacheとAPCuのキャッシュ機能を有効にするためにphp-fpmを再起動します。systemctlコマンドを以下のように実行します。
1 | # systemctl restart php-fpm |
再起動後にphp-fpmのステータスを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since 火 2018-06-12 11:21:36 JST; 5s ago Main PID: 10383 (php-fpm) Status: "Ready to handle connections" CGroup: /system.slice/php-fpm.service tq10383 php-fpm: master process (/etc/php-fpm.conf) tq10384 php-fpm: pool www tq10385 php-fpm: pool www tq10386 php-fpm: pool www tq10387 php-fpm: pool www tq10388 php-fpm: pool www tq10389 php-fpm: pool www tq10390 php-fpm: pool www tq10391 php-fpm: pool www tq10392 php-fpm: pool www mq10393 php-fpm: pool www 6月 12 11:21:35 www systemd[1]: Starting The PHP FastCGI Process Manager... 6月 12 11:21:36 www systemd[1]: Started The PHP FastCGI Process Manager. |
php-fpmが正常に再起動していることが上記から確認できます。
5-2.Apache(httpd)の再起動
php-fpmと合わせて、念のためにApacheも再起動を行います。
1 | # systemctl restart httpd |
エラーが出力なければ、Apacheは正常に再起動しています。ステータスを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since 火 2018-06-12 11:21:50 JST; 5s ago Docs: man:httpd(8) man:apachectl(8) Process: 10401 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS) Process: 8645 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Main PID: 10404 (httpd) Status: "Processing requests..." CGroup: /system.slice/httpd.service tq10404 /usr/sbin/httpd -DFOREGROUND tq10405 /usr/sbin/httpd -DFOREGROUND mq10406 /usr/sbin/httpd -DFOREGROUND 6月 12 11:21:49 www systemd[1]: Starting The Apache HTTP Server... 6月 12 11:21:50 www systemd[1]: Started The Apache HTTP Server. |
上記の結果からApacheは正常に再起動していることが確認できました。これでOPcacheとAPCuの有効化は完了です。
6.パフォーマンスの比較
ここまででOPcacheとAPCuの導入と機能の有効化が完了しました。実際のどの程度、パフォーマンスが向上したかをApacheに付属しているApache Benchコマンド、”ab”で測定してみます。abはApacheを導入すると同時にインストールされます。ここでは環境として、別のサーバーから、OPcacheとAPCu(+ php-fpm)を導入したサーバーを測定するようにしています。
6-1.初回のabテスト
先ずはキャッシュがない状態でのテストを行います。abコマンドにはオプションとして”-n”と”-c”を指定します。-nはリクエスト総数を指定します。-cは同時接続数になります。本記事では100リクエストを同時接続10ユーザーを前提としてテストを実行しました。(記事「WordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。」と比較を行うため、同条件でテストを行っています。)
結果は以下のようになりました。
abテスト初回(キャッシュなし)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # ab -n 100 -c 10 https://www.testdom.com/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.testdom.com (be patient).....done Server Software: Apache/2.4.6 Server Hostname: www.testdom.com Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 Document Path: / Document Length: 53148 bytes Concurrency Level: 10 Time taken for tests: 10.523 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 5342200 bytes HTML transferred: 5314800 bytes Requests per second: 9.50 [#/sec] (mean) Time per request: 1052.251 [ms] (mean) Time per request: 105.225 [ms] (mean, across all concurrent requests) Transfer rate: 495.79 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 4 17 29.3 6 152 Processing: 120 606 862.9 300 5573 Waiting: 103 550 801.9 242 4687 Total: 125 623 878.7 305 5595 |
本テストでは以下の項目に注目しました。
- Time taken for tests: 10.523 seconds
- Requests per second: 9.50 [#/sec] (mean)
”Time taken~”はテストの所要時間、”Requests per~”は秒間でどれだけのリクエストを処理できたかを示す項目になります。上記から従来の構成では、テストの所要時間は約10.5秒で、1秒間に処理できたリクエストは約9.5になります。
php-fpmのみの構成の場合、以下の数値でした。(記事「WordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。」項目8-2.を参照)
- Time taken for tests: 13.655 seconds
- Requests per second: 7.32 [#/sec] (mean)
この数値と比較すると、やや早くなっているというレベルでそれ程、大きくは変わっていません。
6-2.二回目のabテスト
続いて同じ条件で二回目のテストを行います。二回目にはキャッシュが利用されますので、初回よりパフォーマンスが出ることが期待できます。結果は以下のようになりました。
abテスト二回目(キャッシュあり)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | # ab -n 100 -c 10 https://www.testdom.com/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.testdom.com (be patient).....done Server Software: Apache/2.4.6 Server Hostname: www.testdom.com Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 Document Path: / Document Length: 53148 bytes Concurrency Level: 10 Time taken for tests: 2.898 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 5342200 bytes HTML transferred: 5314800 bytes Requests per second: 34.50 [#/sec] (mean) Time per request: 289.822 [ms] (mean) Time per request: 28.982 [ms] (mean, across all concurrent requests) Transfer rate: 1800.07 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 4 9 9.8 6 93 Processing: 63 274 82.9 272 505 Waiting: 41 201 70.2 202 482 Total: 68 283 83.6 278 513 Percentage of the requests served within a certain time (ms) 50% 278 66% 325 75% 342 80% 358 90% 393 95% 412 98% 484 99% 513 100% 513 (longest request) |
本テストでは以下の項目に注目しました。
- Time taken for tests: 2.898 seconds
- Requests per second: 34.50 [#/sec] (mean)
”Time taken~”はテストの所要時間、”Requests per~”は秒間でどれだけのリクエストを処理できたかを示す項目になります。上記から従来の構成では、テストの所要時間は約2.8秒で、1秒間に処理できたリクエストは約34.5になります。
二回目にはキャッシュが有効になっているため、php-fpmのみの場合と比較して、所要時間で約6倍、リクエスト数は約5倍と大きなパフォーマンス向上が確認できました。
このことからOPcacheとAPCuについては、WordPressの速度向上に大きな効果があると思われます。
7.まとめ
WordPressのパフォーマンスを向上するために、最近の記事で二つの方法を紹介してきました。
- eventMPMを利用して、php-fpmと組み合わせる方法
- PHPアクセラレータと呼ばれるキャッシュ用機能を利用する方法
どちらの方法もパフォーマンスを向上するために有効であることが確認できました。特にPHPアクセラレータについては効果が大きい為、自社サーバーやVPSで運用している場合は、かなりの効果が期待できます。
WordPress側でもキャッシュを行うプラグインがリリースされていますが、こちらは不具合も多いので、是非、OPcacheやAPCuを利用してWordPressの高速化を体験してみて下さい。デフォルトでの運用と比較して体感でわかる程に速度が向上します。