cakePHP×eAccelerator、相性良い!?

とある自社サービス、LAMPcakePHPで運営されています。
このサービス、夜な夜な、重くなり、下手すると繋がらなくなることも。
大体、夜8時〜11時がピーク。トラフィックが多い時間帯のようです。


その度に、深夜とかに、net-snmp様からアラートメール○| ̄|_
SSHログイン(めちゃ重い、login:を売った後passwordと聞かれるまで数分)


top見ると、

  • ロードアベレージが恐怖の100超え。150とか。
  • userがCPU占拠しまくり。メモリには微妙に余裕、i/oが結構来てるっぽい。
  • httpdがずざーっと、ページ一杯占拠している


apacheのmpmいじったり、PHPバージョンうpしてみたり、試行錯誤を繰り返したが解決せず。
cakeのアプリ側の処理にも問題が見当たらない。
トラフィック、多いっちゃ多いけどまだいけるだろう、ってレベル。


毎晩毎晩、アラート→apachectl restartを繰り返し、寝不足の日々でした。
広告は補填、ユーザーからは苦情。


最後の手段で、フレームワークと相性が怖いからつかってなかった、eAcceleratorを突っ込んでみることに。
cakeがOKでも、一緒に入れてるサービスに使っている、S2Containerあたりのところが不安で不安で仕方が無かったのですが、落ちて一緒に見れなくなるよりはいいだろうと、決行しました。

/xx/xxx/xx/apachectl stop (ロードアベレージが落ち着くのを待つ)
cd /xx/xxx/xx/eaccelerator-0.9.5-beta2
phpize
./configure --enable-eaccelerator=shared --with-php-config=/xx/xxx/xx/php-config
make
make install
mv control.php /ドキュメントルート内のどこか

↑まぁアレなんで、apache側で社内とかからしかアクセスできなくしておく。
ちなみに、control.phpが動かなかったので、はじめに出てくるif文とその下でコメントアウトされているif文を交換してみたらいけました。

mkdir /tmp/eaccelerator

上記ディレクトリを777に(適当)


php.iniに下記を追記

[eaccelerator]
zend_extension="make installの際に出てきたsoのpath/eaccelerator.so"
eaccelerator.shm_size = "128"
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 = "/適当なdocumentroot内/control.php"

apachectl start


すると


ロードアベレージが2台キープ、すげーー、150から2になった。そして、観察してても一向に上がりません。
すげーeAccelerator。ここまで効果でるもんなのか。
S2containerにも、CakePHPにも、不具合は出ませんでした。おめでとうございました。


何でこんな改善されたのかは、よくわかんないですが、
cakePHPは、読み込みファイルが多すぎるとかなのかな。大規模FWは全部そうなのか??
高負荷環境で使ったこと無いからわかんないけど。


セッションの読み書きとかなのかな、とも考えられるのですが、セッションをmemcacheやDBにしてみるのは手間的にもうちょっと先になりそうです。。
Webサーバの分散(DNSラウンドロビン)するために早期導入を考えていたものの、docomoiモードIDに対応してくれたし、使うところでそいつを送信すればセッション無くても結構どうにかなりそう?ですので。


何はともあれ、とりあえず、cakePHPとeAccerelatorの相性は抜群に良いことが分かりました。
一安心。


・・・


考えてみればロードアベレージ2って軽くない○| ̄|_