アブストラクト:
このサイトはWordPressで構築されています.
今回はPHPコードをキャッシュして高速化する Zend OPcache を使用して,レスポンスの約1.5倍の高速化しました.
WordPress高速化プロジェクト 記事一覧:
Contents
WordPress はコンテンツの更新しやすさ,テーマ/プラグインの適用の容易さ等でかなり優れているツールですが,レスポンスが遅いなと感じることが多々あります.体感でもページ表示に1秒ぐらい要する感じです.
この辺はCMS特有のデメリットだと思いますが,特に WordPress はレスポンスごとに発生するデータベースへのアクセスと PHP での動的コンテンツ生成で時間を消費してしまいます.
このサイトは特にアクセスが多いわけでもないですが,レスポンスが遅いときあってたまにイライラするので今回から複数回に分けて高速化を検討していきます.
WordPress を高速化にはいくつかの方法があります.簡単に分類すると次にようになります.現在Webサーバにapacheを使用していること前提です.
参考文献:
– WordPressを100倍速くする! MySQLの調整やnginx proxy cache | KRAY Inc
– さくらVPSのWordPressをチューニングして30倍高速化した方法 – 原宿・表参道.jp
– Nginxを使ったもう一歩進んだWordPressチューニング | cloudrop
以上,1~6 まで挙げましたが,数字の順にハードルが高くなっている(導入/設定が面倒)と思います.しかし数字の順に効果は大きいと推測しますが.
また,3 のWordPress高速化プラグインの使用は,平気で config.php や .htaccess を書き換えたりしたり,中身で何やってるかよくわからないのでできれば使用したくありません.結局やろうとしていることは動的コンテンツのキャッシュなので,プラグインで実現する機能は 4 や 6 のWebサーバのキャッシュ機能で実現できます.
2 のデータベース高速化に関してはプラグインや自前関数でとんでもないSQLクエリを実行していない限り大きな問題にはならない気がしますので手を触れません.
他にも,コンテンツのキャッシュ期限を明示的にすることによってクライアント側のブラウザキャッシュにコンテンツを残す,レスポンスコンテンツをgzip圧縮すること等によって,間接的に高速化することができます.
参考文献:
– WordPressキャッシュ系プラグインの比較とサイトに適した選び方 | ゆっくりと…
よって,1, 4, 5, 6の方法によってWordPressの高速化をしていきます.
第1回は,PHPの高速化をします.
PHPの高速化のメリットは最も手軽にできることでしょう.
リバースプロキシを立てたり,Webサーバを変更するのは,設定ファイルの変更や移行が大きな負担になり,ミスの混入にもなります.
PHPの高速化は難しいことを考えずにただコードキャッシュツールをインストールしてセットアップするだけですので最も手軽です.そのかわり効果は小さいです.
今回PHPコードをキャッシュする Zend OPcache を利用します.
Zend OPcache: PHP: OPcache – Manual
PHPのコードキャッシュツールはいろいろ存在しますが,Zend OPcache は PHP 5.5 から標準搭載になったことやパフォーマンスが良さそうなことからこれを選びました.PHP 5.2 以上であれば Zend OPcache は入ります.
参考文献:
– PHP5.5 のコードキャッシュは APC から Zend OPcache へ – Shin x blog
– とっとこ駆け出しエンジニアぶろぐ: OPcacheがどれくらい速くなるのかやってみた
以下,具体的な導入手順です.
サーバ環境は以下のとおりです.
GitHub上のソースをダウンロードしてコンパイル/インストールします.必須ではないですがmake testして検証しておきましょう.
php-develが必要です.
以下のページが参考になりました.
参考文献:
– PHP5.4 で Zend OPcache をインストールしてベンチマークを取ってみた – Shin x blog
$ sudo yum install php-devel $ git clone https://github.com/zend-dev/ZendOptimizerPlus.git $ cd ZendOptimizerPlus $ phpize $ ./configure --with-php-config=/usr/bin/php-config $ make $ make test $ sudo make install
私の環境だと /usr/lib64/php/modules/ 以下に opcache.so がインストールされます.
そして,php.ini で opcache.so を読み込むように設定します.
具体的には php.ini に以下の8行を追記します.
http://php.net/manual/ja/opcache.installation.php に記載されている「推奨される php.ini の設定」参考にしました.
; 以下の8行を php.ini に追記する. zend_extension=/usr/lib64/php/modules/opcache.so opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1
apacheを再起動させましょう.
$ sudo /etc/init.d/httpd restart
php -v または phpinfo() の出力で Zend OPcache が有効になっていることを確認します.
$ php -v PHP 5.3.3 (cli) (built: Oct 30 2014 20:12:53) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies with Zend OPcache v7.0.5-dev, Copyright (c) 1999-2015, by Zend Technologies
OKですね.v7.0.5-dev が入っています.phpinfo() の出力には以下の様な項目が出現したらOKです.
これで Zend OPcache のインストールおよびセットアップ完了です.
さてどれくらい高速化しただろうか.
ベンチマークには Apache Bench (abコマンド) を用います.対象サーバはVPS上にあって,手元のマシンからコマンドを打ちます.対象ページはブログ記事のインデックスページ http://www.terabo.net/blog/ としました.クライアント数 5,リクエスト回数を 10 とします.
まずは,Zend OPcache 導入前です.
$ ab -n 10 -c 5 http://www.terabo.net/blog/ This is ApacheBench, Version 2.3 <$Revision: 1604373 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.terabo.net (be patient).....done Server Software: Apache/2.2.15 Server Hostname: www.terabo.net Server Port: 80 Document Path: /blog/ Document Length: 33528 bytes Concurrency Level: 5 Time taken for tests: 8.719 seconds Complete requests: 10 Failed requests: 0 Total transferred: 337310 bytes HTML transferred: 335280 bytes Requests per second: 1.15 [#/sec] (mean) Time per request: 4359.749 [ms] (mean) Time per request: 871.950 [ms] (mean, across all concurrent requests) Transfer rate: 37.78 [Kbytes/sec] received 以下略
1秒あたりの平均レスポンス数 1.15 [#/sec] ですね…
遅いです.
さて,Zend OPcache 導入後です.
$ ab -n 10 -c 5 http://www.terabo.net/blog/ This is ApacheBench, Version 2.3 <$Revision: 1604373 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.terabo.net (be patient).....done Server Software: Apache/2.2.15 Server Hostname: www.terabo.net Server Port: 80 Document Path: /blog/ Document Length: 33528 bytes Concurrency Level: 5 Time taken for tests: 5.616 seconds Complete requests: 10 Failed requests: 0 Total transferred: 337310 bytes HTML transferred: 335280 bytes Requests per second: 1.78 [#/sec] (mean) Time per request: 2808.161 [ms] (mean) Time per request: 561.632 [ms] (mean, across all concurrent requests) Transfer rate: 58.65 [Kbytes/sec] received 以下略
1秒あたりの平均レスポンス数が 1.78 [#/sec] に向上しています.約1.5倍 の高速化です.
劇的な高速化ではありませんが,導入コストの割には効果があるんじゃないかと思います.
多分動的コンテンツをキャッシュを利用するような高速化だともっと効果があって,桁レベルでの高速化が見込まれるんじゃないかと思います.それは次回以降にやります.
次回は,本記事の冒頭で箇条書きした 4 の「リバースプロキシを立ててキャッシュによる高速化」をやります.