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無効とするのがよいのかもしれない。