K4750.NET

WordPressの性能解析

XHProf(Hierarchical Profiler)という性能解析ツールを使用して、WordPressにおいて処理に時間がかかっている個所をあぶり出し、可能であれば改善する。既にAPCの導入ja.moファイルの無効化により大きな改善は見られているため、今回は細々とした改善になると思われる。


1.XHProf導入

まずは、XHProf拡張をコンパイル・インストール。

$ wget http://pecl.php.net/get/xhprof-0.9.3.tgz
$ tar xvfz xhprof-0.9.3.tgz
$ cd xhprof-0.9.3/extension/
$ phpize
$ ./configure
$ make
$ make test
$ sudo make install

/etc/php5/apache2/php.ini等に以下を追加する。

[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp

Apacheを再起動(service apache2 restart)後、XHProf拡張は有効になる。

XHProfではコールグラフを生成できるので、そのために必要なコマンドもインストールしておく。

$ sudo apt-get install graphviz

2.WordPressのプロファイリング

index.phpを以下のとおり編集する(赤字部分を追加する)。/home/www-data/xhprof-0.9.3は先ほどのxhprof-0.9.3.tgzを展開したディレクトリ。

<?php
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require('./wp-blog-header.php');

$xhprof_data = xhprof_disable();
include_once "/home/www-data/xhprof-0.9.3/xhprof_lib/utils/xhprof_lib.php";
include_once "/home/www-data/xhprof-0.9.3/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$xhprof_runs->save_run($xhprof_data, "xhprof_foo");
?>

そして、WordPressのトップページにアクセスすると、サーバ上の/tmpディレクトリ配下に5233bea4082fb.xhprof_foo.xhprofといった名前のファイルが生成される。


3.プロファイル解析

xhprof-0.9.3.tgzに格納されている以下の2つのディレクトリを、WordPressと同じディレクトリ(例えば、/var/www)へコピーまたは移動する。

$ cp -rp .../xhprof-0.9.3/xhprof_html /var/www
$ cp -rp .../xhprof-0.9.3/xhprof_lib /var/www

そして、ブラウザから「http://…/xhprof_html/」へアクセスすると、/tmp配下に生成されたプロファイルが一覧表示されるので、ファイルをクリックすると・・・あとは個々の関数呼び出しにかかる時間や割合、コールグラフによる視覚的な呼び出し関係が確認できる(詳細割愛)。


4.解析結果

XHProfの結果をざっと見ると、私個人レベルで簡単に改善できそうな個所はほとんど見られず。ただ、細かい点として、convert_smilies(スマイリーを画像へ変換するフィルタ)に11ミリ秒、自作のカレンダー表示に15msかかっていた。カレンダーはせっかく作ったモノなのでそのままとして、convert_smiliesは不要なので使用しないことにした(管理画面の投稿設定「:-) や :-P のような顔文字を画像に変換して表示する」をオフにする)。


5.ab(ApacheBench)の結果

abコマンド(ab -c 20 -n 200 http://www.k4750.net/(20多重で200リクエスト))の実行結果について、前回(ja.moの無効化)との比較を以下に示す。

テスト時間(秒) 秒間リクエスト数 リクエスト時間
(ミリ秒)(平均)
初期状態 26.370 7.58 2637.035
APC導入後 12.973 15.42 1297.319
WPLANG変更後 8.869 22.55 886.885
convert_smiliesオフ 8.235 24.29 823.525