CakePHP パフォーマンスチューニング

こんにちは、おがしょ〜です。

現在進行中のプロジェクトで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のコア部分でいくつか微妙な箇所がありました。
  1. モデルをたくさん使っているコントローラが遅い
  2. セッションのストア先にmemcachedを指定すると遅い
  3. ImageMagick(convert)の変換処理が遅い


3はCakePHP関係ないですね;結論からいうと上記3つが主なボトルネックでして、解決することでかなりのパフォーマンスアップが図れました!が、長くなりそうなので解決編は次回以降のエントリに分けます・・・。

コメントを投稿する