ZAPAnet総合情報局 > ZAPAブログ2.0 > XCacheのインストールとphp用アクセラレータ比較

XCacheのインストールとphp用アクセラレータ比較

2006年11月17日 プログラミングTIPS
PHP5.2.0とeAcceleratorのインストールメモで気にかけていたXCacheですが、今回実際にインストールしてみることにしました。

ポケットモンスター ダイヤモンド・パール攻略Wikiのページ数が1000ページを越え、pukiwikiのAutoLink機能で多大な負荷がかかってしまっているため、少しでもその他の動作を軽くするためにXCacheのインストールに挑戦してみました。
(ページ数が1000を越えて以来、オンライン人数が100人を越えるとロードアベレージが30以上になってしまい重くてとても使いづらい状況です。混雑している時間帯はAutoLink機能をオフにしてロードアベレージは3程度です)

PHPアクセラレータで一番高速なのはどれか? - GIGAZINE
によると、最近ではPHPアクセラレータとしてXCacheがオススメらしいと聞いていましたが、XCacheの日本語の解説サイト、インストール記録サイトがほとんどなくて苦労しました。

今回のXCacheのインストールで、PHP用のアクセラレータはAPC以外は試したことになります。
PHP Accelerator インストールメモ
Zend Optimizerインストール
PHP5.2.0とeAcceleratorのインストールメモ
php5にはPHPAが対応していないことを考えると、今後はeAcceleratorかXCacheを選択し、それに加えてZend Optimizerを併用するかしないかの選択になります。
(Zend Optimizer単体では遅くて使い物になりませんでした)

XCacheのインストール

サーバーに管理者権限でログイン。
ソースダウンロード場所に移動して安定版のxcacheのダウンロードと解凍。
cd /usr/local/src
wget https://210.51.190.228/pub/XCache/Releases/xcache-1.0.3.tar.gz
tar xzvf xcache-1.0.3.tar.gz
解凍ディレクトリに移動。
cd xcache
configure設定。
/usr/local/php5/bin/phpize
./configure --enable-xcache --with-php-config=/usr/local/php5/bin/php-config
make。
make
ところが、エラーが出てうまく行かず。
AUTOCHECK ERROR: ==== calc zend_brk_cont_element =================
make: *** [processor.out] Error 1
今度は非安定版のxcache-1.1.0.tar.gzをダウンロードし直してから、makeとmake install。
make
make install
インストールが終わったら、最後に表示されるパスをメモ。
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/
このディレクトリにxcache.soが作成されていればOK。

続いて、php.ini(ディレクトリは環境に合わせて)の設定。
vi /usr/local/php5/php.ini
PHP5.2.0とeAcceleratorのインストールメモで設定していたeAcceleratorの設定を全てコメントアウト。
[eAccelerator]
;zend_extension = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
;eaccelerator.shm_size = "44"
;eaccelerator.cache_dir = "/tmp/eaccelerator"
;eaccelerator.enable = "1"
;eaccelerator.optimizer = "1"
;eaccelerator.check_mtime = "1"
;eaccelerator.debug = "0"
;eaccelerator.filter = ""
;eaccelerator.shm_max = "0"
;eaccelerator.shm_ttl = "0"
;eaccelerator.shm_prune_period = "0"
;eaccelerator.shm_only = "0"
;eaccelerator.compress = "1"
;eaccelerator.compress_level = "9"
;eaccelerator.keys = "shm_and_disk"
;eaccelerator.sessions = "shm_and_disk"
;eaccelerator.content = "shm_and_disk"
代わりに、xcache.iniの内容を追加。
[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/local/lib/php/extensions/non-debug-non-zts-xxx/xcache.so
; zend_extension_ts = /usr/local/lib/php/extensions/non-debug-zts-xxx/xcache.so
;; For windows users, replace xcache.so with php_xcache.dll
zend_extension_ts = c:/php/extensions/php_xcache.dll
;; or install as extension, make sure your extension_dir setting is correct
; extension = xcache.so
;; or win32:
; extension = php_xcache.dll

; required for >=php5.1 if you turn XCache on
auto_globals_jit = Off

[xcache.admin]
xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = ""

[xcache]
; ini only settings, all the values here is default unless explained

; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 0M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count = 1
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0

; same as aboves but for variable cache
xcache.var_size = 0M
xcache.var_count = 1
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300

xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path = "/dev/zero"


; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory = ""

; per request settings
xcache.cacher = On
xcache.optimizer = Off

[xcache.coverager]
; ini only settings
; make sure it's readable (care open_basedir) coverage viewer script
xcache.coveragedump_directory = "/tmp/pcov/"

; per request settings, will be auto disabled if xcache.coveragedump_directory is not set
xcache.coveragedumper = Off
この内容を自分の環境に合わせて編集した後、再起動。
service httpd restart
これでxcacheが動き出したはずなので(うまくいっていれば)、次にブラウザ管理の設定。
xcacheのadminディレクトリを公開ディレクトリにコピー。
cp admin /公開ディレクトリ/
このディレクトリにブラウザからアクセスして、php.iniに設定したxcache.admin.userとxcache.admin.passを入力して管理画面へ。(xcache.admin.passが正常に設定されていないと管理画面へは入れないので注意)
以下のような画面が表示され、キャッシュ状況を細かく確認できます。


初期設定として、xcache.size = 64Mとして1時間ほど動かしてみましたが、Availの値は31.2Mとなっていたため、64Mからもう少し減らした方が良さそうです。
このように、管理画面をチェックして自分の環境に合わせてxcache.sizeを修正していきます。

今回、どのように設定したら一番良いのか、事例が見つからなかったため、自分で以下のように適当に設定してみました)
[xcache-common]
zend_extension = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/xcache.so"
; required for >=php5.1 if you turn XCache on
auto_globals_jit = Off

[xcache.admin]
xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = ""

[xcache]
; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
xcache.size = 44M
xcache.count = 1
xcache.slots = 8K
xcache.ttl = 0
xcache.gc_interval = 0
xcache.var_size = 20M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
xcache.readonly_protection = Off
xcache.mmap_path = "/tmp/xcache"
xcache.coredump_directory = ""
xcache.cacher = On
xcache.optimizer = On

[xcache.coverager]
xcache.coveragedump_directory = "/tmp/pcov/"
xcache.coveragedumper = Off
稼働後に確認してみたところ、xcache.var_sizeは20Mの100分の1さえも消費されていませんでした。

実際にXCacheを使ってみて

XCacheの設定が終わり、httpdを再起動したところで、次に体感速度がどのようになったのかをチェックしてみました。
体感速度は…
XCacheの体感速度は、eAcceleratorとほとんど同じ
XCacheにしたら明らかに速くなったとか、明らかに遅くなったとかそのようなことは感じませんでした。
負荷のかかるpukiwikiのAutoLink機能をオンにしてみたところ…ロードアベレージは80近くまで上昇してしまい、eAcceleratorより速いといわれているXCacheにしたところで速くなったりはしませんでした。(負荷のかかる部分が、キャッシュでどうこうなるわけではないので、これは仕方のないことです)
生のPHPを使っているときに、eAcceleratorを導入して体感速度が10倍になったように感じたのと比べると、XCacheとeAcceleratorに違いはあまり感じられませんでした。

XCacheとeAcceleratorをグラフで比較

今まで使っていたeAcceleratorとXCacheのどちらが優れているかを見極めるため、体感速度ではなく実際にXCacheを利用したときのサーバーのCPU負荷状況、ロードアベレージをグラフで調べてみました。
一般的な負荷をかけた測定ではなく、実際のアクセスに合わせた本番での測定値となります。
(どちらのアクセラレータにも得手不得手はあるはずなので、実際のコンテンツに合わせた計測の方が、どちらを採用した方が良いのかがわかるはずです)

今回の実験方法は、30分に1回PHP用アクセラレータを切り替えてサーバーの状況をグラフで計測しています。
グラフ上の時間では
〜21:52 XCacheで動作
21:52〜 eAcceleratorで動作
22:22〜 XCacheで動作
と切り替えて(service httpd reloadにより)計測しています。

・CPU負荷

このCPU負荷のグラフではとてもわかりにくいですが、21:52にeAcceleratorへ、22:22にXCacheに切り替えています。
CPU負荷の面ではどちらもあまり変わりは無いようです。


・ロードアベレージ

切り替えた瞬間は、httpd reloadによりロードアベレージが上昇していますが、その後キャッシュも作成され、安定した動作になっていきます。

・ロードアベレージその後

上のグラフに入りきらなかった部分のグラフになります。
サーバーへの実際のアクセス状況まではコントロールすることができないため、結果としては
eAcceleratorもXCacheも同じくらい速い
としか言えません。

XCacheとeAcceleratorの比較考察

今回は30分に1回切り替えて計測しましたが、本当はもう少し長い時間計測した方が良かったかもしれません。
ただし、時間帯によってアクセス数自体が大きく変わってきてしまうため、完全に同一の条件で比較することができません。
1日ごとに計測するという方法も考えましたが、平日と土日ではアクセス数、アクセス時間帯などが大きく変動してしまい、平日であっても日が違うだけで同じようなアクセス状況にはなりにくいため、今回は30分に1回の切り替えで実験しました。
もっとわかりやすい結果になれば、どちらが優れているかがわかりやすかったのですが、今回の実験からは、どちらが優れていると判断することはできません。
また、eAcceleratorは導入事例や安定実績が多く、XCacheは導入事例・安定実績ともに少なく、まだまだ開発途上であるため、XCacheの導入はもう少し経ってからの方が良いかもしれません。
スピード自体はどちらも速いため、個人的な比較の感想としては
eAccelerator:今まで通り安定して使える
XCache:今後に期待
だと考えています。

取りあえずサーバーの方は、eAcceleratorの方に戻しておきました。