25 January 2012

MediaWikiのキャッシング効果比較(APC, ファイルキャッシュ)

MediaWikiのキャッシュ機能でどれくらいアクセス速度を早く出来るか、比較してみた。

■ 実証環境
・FreeBSD 7.1
・MediaWiki 1.18.1
・PHP 5.2.17 (CGI版)
・MySQL 5.5 (UTF8, データはバイナリ形式保管)

■APCの有効化
実証環境は共有レンタルサーバ(さくらインターネット)のため、APCをユーザディレクトリに置いて利用することにする。

APCライブラリを公式ページからダウンロードし、ビルド

※ 実証環境の「さくらインターネット共用サーバ)ではAPC ver 3.1.7〜3.1.9(最新版)は、動作しない。
※ --with-php-config は使っているPHPのバージョンに合わせること


$ wget http://pecl.php.net/get/APC-3.1.6.tgz
$ tar xvf APC-3.1.6.tgz
$ cd APC-3.1.6
$ phpize
$ ./configure --with-php-config=/usr/local/php/5.2.17/bin/php-config
$ make

出来上がったライブラリを、適当なディレクトリにコピー


$ cp modules/apc.so ~/usr/lib/php5/

php.iniに次の設定を追加
※ さくらインターネット共用サーバでは、サーバのコントロールパネルでphp.iniに追加する

~/www/web/mw/php.ini

extension_dir=/home/user/usr/lib/php5/
extension=apc.so

APCがPHPにロードされているかを確認するため、phpinfo.phpファイルをつぎの内容で作成してアクセスし、APCの項目があればよい。

~/www/web/mw/phpinfo.php

<?php echo phpinfo(); ?>

キャッシュ状態は次のようなスクリプトを作って表示させるか、APCのソースパッケージに含まれる apc.php で詳細を表示できる。

~/www/web/mw/phpinfo.php

<html>
<body>
<pre>
<?php
print_r(apc_sma_info());
print_r(apc_cache_info());
?>
</pre>
</body>
</html>

■ MediaWiki のキャッシュ設定
つぎの3種類のキャッシュが利用できる
・APC
・システムキャッシュ
・記事キャッシュ

LocalSettings.phpの設定は

APCを使う場合


$wgMainCacheType = CACHE_ACCEL;

APCを使わない場合は


$wgMainCacheType = CACHE_NONE;

システムキャッシュにテンポラリファイルを使う場合、書きこむディレクトリを指定する


$wgCacheDirectory = "$IP/cache";

システムキャッシュを使わない場合は、上述の設定は行わない

記事キャッシュにテンポラリファイルを使う場合、書きこむディレクトリを指定する


$wgUseFileCache = true;
$wgFileCacheDirectory = "$IP/cache";
$wgShowIPinHeader = false;

記事キャッシュを使わない場合は、上述の設定は必要無い

■ ベンチマーク

それぞれのキャッシュをON・OFFして、アクセス速度を比較してみた。コマンドラインからつぎのようにベンチマークプログラムを実行して、Time per request: 0000[ms]と表示されている部分を比較する。(システムが安定するまで、数回実行した後の結果を採用する)


$ ab -c 1 -n 50 http://www.example.com/mw/index.php?title=Test_topic

キャッシュ方式によるアクセスに掛る時間 (ミリ秒)
SC=on/TC=offSC=off/TC=offSC=on/TC=onSC=off/TC=on
APC=on9901100470590
APC=off830900470590

※SC:システムキャッシュ、TC:記事キャッシュ

APCがちゃんと動いていないのか…

APCは平均的に50msアクセスを早くするという論評もある。
Five minutes of MediaWiki performance tuning

■ PHP (CGI版)では動かない?

さくらインターネットのPHPではアクセラレータのキャッシュ機能による高速化ができない?

ということだそうです。

Apacheモジュール版のPHPが稼動している別のサーバで試してみたところ

キャッシュ方式によるアクセスに掛る時間 (ミリ秒)
SC=off/TC=offSC=on/TC=on
APC=on7010
APC=off16060

※SC:システムキャッシュ、TC:記事キャッシュ

なお、APCはphp.iniでモジュールを組み込んだら、$wgMainCacheType のせっ定にかかわらずキャッシュが効くようである。

■ 結論
このベンチマーク結果からだけ言えば、システムキャッシュ有効、記事キャッシュ有効、APC無効とするのがよいのかもしれない。