WordPress高速化プロジェクト 手法1「PHP高速化」

アブストラクト:
このサイトはWordPressで構築されています.
今回はPHPコードをキャッシュして高速化する Zend OPcache を使用して,レスポンスの約1.5倍の高速化しました.


WordPress高速化プロジェクト 記事一覧:



WordPress は遅い?

WordPress はコンテンツの更新しやすさ,テーマ/プラグインの適用の容易さ等でかなり優れているツールですが,レスポンスが遅いなと感じることが多々あります.体感でもページ表示に1秒ぐらい要する感じです.
この辺はCMS特有のデメリットだと思いますが,特に WordPress はレスポンスごとに発生するデータベースへのアクセスと PHP での動的コンテンツ生成で時間を消費してしまいます.
このサイトは特にアクセスが多いわけでもないですが,レスポンスが遅いときあってたまにイライラするので今回から複数回に分けて高速化を検討していきます.

WordPress 高速化手法

WordPress を高速化にはいくつかの方法があります.簡単に分類すると次にようになります.現在Webサーバにapacheを使用していること前提です.

  1. PHPの高速化 (APC, Zend OPcache 等を使用)
  2. データベースの高速化 (インデックスの設定,クエリ数の削減等)
  3. WordPress高速化プラグインの使用 (WP Super Cache等)
  4. リバースプロキシサーバのキャッシュを利用 (Varnish, nginx等)
  5. Webサーバ自体を軽量なものにする (nginx等)
  6. Webサーバをnginxに変更した上で (FastCGI / proxy cache) を使用

参考文献:
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の高速化をしていきます.

今回の手法: PHP高速化

第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がどれくらい速くなるのかやってみた

導入手順

以下,具体的な導入手順です.

サーバ環境

サーバ環境は以下のとおりです.

  • CentOS release 6.6 (Final)
  • PHP 5.3.3
  • Apache 2.2.15

ダウンロード/インストール

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 の「リバースプロキシを立ててキャッシュによる高速化」をやります.

この記事をシェアする:Tweet about this on Twitter
Twitter
Share on Facebook
Facebook
Email this to someone
email