画像やリンクが無効になっている可能性もあるのでご了承下さい。
WordPress を導入してからサーバーのチューニングじみた事ばかり
している気がしないでもないが、今回は体感できるチューニングってことで、
PHP のアクセラレーターである eAccelerator を導入した。
で、メモメモ。(長い YO)
以前、デスクトップなマシンでサーバーを構築していたいときは APC という
アクセラレーターを入れて PHP の高速化を図っていたわけなんだけど、
APC はインスコがめんどい…。
そこで色々みてたんだけど、PHPA っていうのも結構いけてるようで。
これ実際いれてみたんだけど PHP5 には未対応とのことで、なんら意味のない
物だった。だけどやたら導入は簡単だったので、PHP4 を使ってる人は
PHPA でもいいんでないかなという感じ。
肝心な PHP5 に対応しているアクセラレーターってのは eAccelerator か APC
という選択肢しかないみたい。
上にも書いたけど APC はインスコがメンドイという体験をしただけに今回は
新たに eAccelerator で行ってみようジャマイカということで突撃した。
先ずは eAccelerator 本体のソースを取ってこんといけないねということで
公式サイトより最新の Stable な物を取得してきましょう。
2007/06/30 現在のバージョンは 0.95 となっている。
適当なところへ落としてゴニョゴニョしてあげる。
以下、うちの場合のオペ。
# wget http://jaist.dl.sourceforge.net/sourceforge/eaccelerator/eaccelerator-0.9.5.tar.bz2
# tar jxvf eaccelerator-0.9.5.tar.bz2
# cd eaccelerator-0.9.5
# phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/bin/php-config
(略
# make
(略
# make test
Build complete.
Don't forget to run 'make test'.
bogus test name tests/
# make install
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20060613/
(このパス以下にモジュールがコピーされるので憶えておく)
# vi /usr/local/lib/php.ini
(このファイル末尾に以下の内容を追記するだけ)
[eaccelerator]
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size = "32"
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"
eaccelerator.allowed_admin_path = "control.php を使うならここに設置している絶対パスを入れる"
eaccelerator.log_file = "ログとるならここにファイル名を含む絶対パスを入れる"
(:wq して終わる)
# mkdir /tmp/eaccelerator
# cp ./control.php /path/to/control.php
# chown www:www /path/to/control.php
# vi /path/to/control.php
/** config **/
$user = "ユーザ名";
$pw = "パスワード";
/** /config **/
(ユーザ名とパスだけ設定して :wq して終わり)
# php -v
PHP 5.2.3 (cli) (built: Jun 15 2007 02:28:58)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with eAccelerator v0.9.5, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
ここまで出来たら Apache を再起動かけて完了と。
動作確認で「control.php」を設置したパスにブラウザからアクセスして、設定したユーザとパス入力後、
コントロール画面が出てなんのエラーも無ければ ok!
最初自分は「eaccelerator.allowed_admin_path」の設定が抜けてたのでエラー多発
してうーーーんと悩んだ。
基本的に展開したソースに含まれる「eaccelerator.ini」の内容を参考にというかほぼまんま
記述すれば良い。
変更を加えるのは、
・zend_extension (アクセラレーターモジュールへのパス)
・eaccelerator.shm_size (キャッシュメモリの容量。うちは 32MB にした。)
・eaccelerator.log_file (ログが見てみたいだけで設定してみた。)
・eaccelerator.allowed_admin_path (control.php を使うので設定した)
この 4 つで ok。
参考 eaccelerator.ini からコメント省いたデフォルトな設定やつ。
[eaccelerator]
zend_extension="/usr/lib/php4/eaccelerator.so"
eaccelerator.shm_size = "0"
eaccelerator.cache_dir = "/tmp/eaccelerator"
eaccelerator.enable = "1"
eaccelerator.optimizer = "1"
eaccelerator.debug = 0
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
eaccelerator.name_space = ""
eaccelerator.check_mtime = "1"
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.allowed_admin_path = ""
そんで効果の程を見る。
control.php からキャッシュを OFF にして ApacheBench で集中アクセスした結果。
Server Software: Apache/2.0.59
Server Hostname: bucci.bp7.org
Server Port: 80
Document Path: /
Document Length: 32042 bytes
Concurrency Level: 16
Time taken for tests: 129.859922 seconds
Complete requests: 100
Failed requests: 1
(Connect: 0, Length: 1, Exceptions: 0)
Write errors: 0
Total transferred: 3355970 bytes
HTML transferred: 3326078 bytes
Requests per second: 0.77 [#/sec] (mean)
Time per request: 20777.588 [ms] (mean)
Time per request: 1298.599 [ms] (mean, across all concurrent requests)
Transfer rate: 25.23 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 20 54.2 0 201
Processing: 1060 18316 14499.1 17409 52110
Waiting: 693 8583 7525.0 6390 28989
Total: 1060 18337 14504.9 17409 52110
Percentage of the requests served within a certain time (ms)
50% 17409
66% 25505
75% 31046
80% 34619
90% 38532
95% 42864
98% 45833
99% 52110
100% 52110 (longest request)
次にキャッシュ ON モード
Server Software: Apache/2.0.59
Server Hostname: bucci.bp7.org
Server Port: 80
Document Path: /
Document Length: 32042 bytes
Concurrency Level: 16
Time taken for tests: 78.882311 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 3558342 bytes
HTML transferred: 3526487 bytes
Requests per second: 1.27 [#/sec] (mean)
Time per request: 12621.169 [ms] (mean)
Time per request: 788.823 [ms] (mean, across all concurrent requests)
Transfer rate: 44.04 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 9 23.7 0 81
Processing: 677 11397 5153.4 10183 32789
Waiting: 316 1429 2636.9 348 20063
Total: 677 11407 5161.0 10183 32869
Percentage of the requests served within a certain time (ms)
50% 10183
66% 13159
75% 14577
80% 15350
90% 17961
95% 19860
98% 24094
99% 32869
100% 32869 (longest request)
「Requests per second」を比較すると約 1.6 倍の向上となっている。
その他の項目を見ても大体そんな感じ。
ただ、注目したところは前者だとエラーでリクエスト 1 個とりこぼしてるけど
後者のキャッシュ ON だと全て仕事をこなせているってな所。
ちなみにこの記事を投稿する画面は、表示するまでの速度が 3 倍も速くなっている。
ってのもアレ、WordPress ってのはページの表示にはダイナミックパブリッシングって物を
しているので「ブラウザ→ PHP → MySQL → PHP → 表示」という流れになっている。
MySQL へのアクセスが主体となるような作りだから劇的な速度向上には繋がらない
という結果となった。
完全 PHP な「半死半生の某コンテンツ」に同様のテストを行ったところ、
ON : Requests per second: 3.85 [#/sec] (mean)
OFF : Requests per second: 2.01 [#/sec] (mean)
ということで、約 1.9 倍の速度 UP となりますた。
既にこの eAccelerator の PHP モジュールは稼働しているので、ブログ閲覧も
体感できる速度 UP している状態。
めでたしめでたし。
最後に書くのもアレなんだけど、高速化というのは PHP が実行時にコードをコンパイルしながら
データを出力していく物なんだけど、この時生成される中間コンパイルコードをキャッシュする事で
次回呼びだしはコンパイルせず、中間コンパイルコードから呼び出すことで高速化するという物でふ。
キャッシュはオンメモリで行われると同時にディスク上にも保存される。
その為、うちの環境ではスワップアウトかまされてます orz
WordPress 以外にも PHP で記述された大規模な CGI でも効果大だとおもわれ。
OpenPNE とか XOOPS とか phpBB とかね。
コメント