Linux Tips


PHP/Optimizer

phpでは、実行の際、スクリプトを中間言語に変換してから、実行するという手順が取られ、実行後、その中間言語形式のものは破棄されるらしい。詳細については、他で探してもらうとして、ここでは、キャッシュを用いた Optimizer (正確には、opcode cacher?)の比較をする。

種類

APC(Alternative PHP Cache)
PECLに含まれる。Yahooも使っているらしい。
eAccelerator
Trunk MMCacheが元になっている。
xcache
新たに作られたcacher。
ionCube PHP Accelerator
Yahooが使ってるのはこっちだった。暇があったらベンチマークしてみよう。…と思ったが、バージョン5.xには未対応だ。
Zend Optimizer
PHPの開発にも貢献している、Zend社のOptimizer。名前のとおり、これは他のものと違って、ソースコードの最適化を行ってくれるものだが、今回の比較対象とした。

これらは、基本的に併用は不可 eAccelerator と Zend Optimizer, XCache と Zend Optimizer は併用することが可能。

インストール

_ APC

PECL からソースを持って来る。最新版は、3.0.16。

% tar zxf APC-3.0.10.tgz
% cd APC-3.0.10
% phpize
% ./configure --with-gnu-ld --enable-apc --enable-apc-mmap --enable-apc-sem

Apacheなら、httpd.hのあるディレクトリを /usr/include/apache2 として、

% export CPPFLAGS="-I/usr/include/apache2 -DAPC_PHP4_STAT" 
% ./configure --with-gnu-ld --enable-apc --enable-apc-mmap --enable-apc-sem --with-apxs=/usr/sbin/apxs2
% make
# make install

php.iniへ、APCの設定を追加。場所は、; Dynamic Extensions ; のところへ。

[apc]
extension=apc.so
apc.mode = mmap
apc.cachedir = "/var/cache/apc"
apc.check_mtime = 1
apc.shm_size = 30
apc.optimization = 1
apc.ttl = 43200
apc.check_compiled_source = 1

apc.shm_size のデフォルト値は30MB(?)らしい。単位はMB。また、 apc.cachedir で指定したところに、 httpd の実行ユーザで書き込めるディレクトリを作っておくこと。

以上で設定は終了。必要ならhttpdをリスタートする。

_ eAccelerator

http://eaccelerator.net/ からソースをダウンロード。

% tar zxf eaccelerator-0.9.5.2.tar.gz
% cd eaccelerator-0.9.5.2
% phpize
% ./configure --enable-eaccelerator=shared
% make 
# make install

php.iniへ、eAcceleratorの設定を追加。場所は、 ; Dynamic Extensions ; のところへ。

[eaccelerator]
zend_extension=/usr/lib/php4/.../eaccelerator.so
eaccelerator.shm_size="0"
eaccelerator.cache_dir="/var/cache/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"

eaccelerator.shm_size は、0とするとデフォルト値が適用される。phpinfo を確認して、必要があれば増やす。単位はMB。闇雲に大きくしても、使用メモリを増やすだけとなるので注意。また、 eaccelerator.cache_dir で指定したところに、httpdの実行ユーザで書き込めるディレクトリを作っておくこと。 eaccelerator.compress="1", eaccelerator.compress_level="9" は、それぞれ最大で圧縮となっているが、無効にした方がよい場合もあると思うので、要調整。

以上で設定は終了。必要ならhttpdをリスタートする。

_ xcache

ここ から最新ソースをダウンロード。

% tar zxf xcache-1.2.2.tar.gz
% phpize
% ./configure --enable-xcache
% make
# make install

php.iniへ、xcache の設定を追加。場所は、; Dynamic Extensions ; のところへ。

[xcache]
zend_extension="/usr/lib/php4/.../xcache.so"
xcache.cacher = On
xcache.size = 20M
xcache.count = 1
;xcache.slots = 20k
xcache.optimizer = On
xcache.mmap_path = "/tmp/xcache"
xcache.var_size = 20M
xcache.var_count = 1
;xcache.var_slots

xcache.size の単位はMB。また、 xcache.mmap_path で指定したディレクトリは、プログラム実行時に自動的に作成されるらしいので、親ディレクトリが実行ユーザで書き込めるようになっている必要がある。しかも、あらかじめ作成してあるとエラー終了する。

PHP Fatal error:  XCache: Cannot create shm in Unknown on line 0
PHP Fatal error:  XCache: Cannot init in Unknown on line 0
PHP Fatal error:  Unable to start XCache module in Unknown on line 0

何て仕様だ。

以上で設定は終了。必要なら httpd をリスタートする。

_ ionCube PHP Accelerator

ここからダウンロードし、展開。なお、php-5.xにはまだ対応していないようだ。

% tar zxf php_accelerator-1.3.3r2_php-4.4.0_linux_i686-glibc2.1.3.tgz
% cd php_accelerator-1.3.3r2_php-4.4.0_linux_i686-glibc2.1.3

ライブラリを適当なディレクトリへコピー。

% cp php_accelerator_1.3.3r2.so /usr/lib/php4/lib/php/extensions/no-debug-non-zts-20020429/

php.ini へ、以下を追加。

zend_extension="/path/to/php_accelerator_1.3.3r2.so"
phpa = on
phpa.tweaks = on
phpa.cache_dir = /tmp
phpa.file_perms = 400
phpa.cache_file_prune_period = 1h
phpa.cache_file_ttl = 1d
phpa.shm_size = 8
phpa.shm_perms = 666
phpa.shm_release_at_exit = on
phpa.shm_stats_check_period = 5m
phpa.shm_ttl = 12h
phpa.shm_max_processes = 512
phpa.shm_lock_threshold0 = 10
phpa.shm_lock_threshold1 = 10

以上で終了。ちなみに、上のコンフィグ値は全てデフォルト。詳細は、CONFIGURATION に説明があるので、そちらを参照のこと。

キャッシュサイズ(phpa.shm_size)については、付属するプログラム、

% phpa_cache_admin -mv

でのメモリ使用量に応じて増やすべし、ということだ。

_ Zend Optimizer

Zend Japan からダウンロード。会員登録が必要。

% tar zxf ZendOptimizer-3.0.0-linux-glibc21-i386.tar.gz
% cd ZendOptimizer-3.0.0-linux-glibc21-i386
# ./install.sh

あとは、インストーラに従ってインストール。設定まで行ってくれる。必要ならhttpdをリスタートする。なお、--enable-versioningを指定してコンパイルしていると、動かないようだ。

また、eaccelerator, xcache と併用する場合は、Zend Optimizer の設定を後に記述する。

比較

このwikiの Lighttpd の旧ページへアクセスした時間を計測。サーバは、VMware(memory 160MB) 上の lighttpd (Debian Sarge)。ホストは、 AthlonXP1700+/512MB (Gentoo Linux)。比較として、eAccelerator には、圧縮なしの条件も加えた。

_ 200回アクセス(同時アクセス数1)

% /usr/sbin/ab2 -n 200 -c 1 "http://pinga.mini13i.gotdns.org/linux/?Lighttpd"
ab-php1.png
 
noneAPC-3.0.10Zend-3.0eAccel-0.9.4eAccel-0.9.4(圧縮なし)xcacheeAccel + ZendeAccel + Zend(圧縮なし)
最短296240314266269245291295
平均310321345286289264317321
最長4171683654424437494376475

_ 500回アクセス(同時アクセス数5)

% /usr/sbin/ab2 -n 500 -c 5 "http://pinga.mini13i.gotdns.org/linux/?Lighttpd"
ab-php2.png
 
noneAPC-3.0.10Zend-3.0eAccel-0.9.4eAccel-0.9.4(圧縮なし)xcacheeAccel + ZendeAccel + Zend(圧縮なし)
最短6215566646005005137441027
平均17141278164414991436130215891590
最長43751762215934051959249821283736

うーん、微妙な結果。どれ使おう…。PHPのバージョン、キャッシュサイズやコンテンツ、ボトルネック等によって結果は変化してくるはず。

ただ、一番 CPU への負荷が小さいのは圧縮なしの eAccelerator。これは、MMX Pentium 133 で試したときに一番パフォーマンスが良かったため。。

参考


:Apache:Lighttpd:PHP

 
Link: Lighttpd/FastCGI(1443d) PHP(1927d)
Last-modified: 2012/05/19 (土)