こんにちは、おがしょ〜です。
現在進行中のプロジェクトでCakePHPなるフレームワークを使っているんですが、これが機能満載で思いのほか重い。使用しているバージョンは 1.2RC3 です。「CakePHP パフォーマンス」とかでググってみると1.1に比べてだいぶ遅いというベンチマーク結果などが出てきました。やっぱり。。
とはいえ開発も終盤でフレームワークの変更はしたくないですし、メインの開発陣とは別にチューニング箇所について調査することにしました。まずシステム構成ですが、
- Linux(なんだっけ?)
- Apache2
- mysql5
- mod_php5
まんまLAMPですね。
あとはアプリ側キャッシュにmemcachedを使ってたり、画像配信にSquidを前に立てたりします。
で、PHP&CakePHP側の主要な構成ですが、
- コードキャッシュ&ローカルキャッシュにはAPCをチョイス。
- CakeのCacheエンジンはAPCとMemcacheを用途に応じて切り替え。
- Memcachedは複数サーバから同じデータを参照する必要のあるものにのみ使用する。それ以外のどうでもいいキャッシュはAPCに格納する。パフォーマンスはたぶんローカルmemcachedと同じようなものかと。
まず、Apacheについてくる ab(ApacheBench) コマンドで実際のページのパフォーマンスを計測していきます。
> $ ab http://example.jp/
コマンド終了時に表示された内容の「Requests per second: x.xx [#/sec]」の部分でだいたいの性能をみます。秒間n回リクエストを捌きました的な意味合いだと思います。
どんな数字が出れば速いのか?の基準については私もよくわかりません;;ただ体感的に考えて、1#/sec 程度だとブラウザの表示に最低1秒以上かかってることになるのであまりよろしくないですよね。この辺りの判断は人によります、たぶん・・・。
で、abで計測した結果をみて思ったことは、「なんか全体的に同じように遅い」でした。商品DBなんかの検索機能のあるページとかが飛び抜けて遅いだけなら複雑なSQLクエリとかが原因と考えられたりしますが、どうもそうではない様子。もっと細かく調べてみたところ、CakePHPのコア部分でいくつか微妙な箇所がありました。
- モデルをたくさん使っているコントローラが遅い
- セッションのストア先にmemcachedを指定すると遅い
- ImageMagick(convert)の変換処理が遅い
3はCakePHP関係ないですね;結論からいうと上記3つが主なボトルネックでして、解決することでかなりのパフォーマンスアップが図れました!が、長くなりそうなので解決編は次回以降のエントリに分けます・・・。