【CakePHP】Cakeのパフォーマンス問題を目の当たりにした!

今週は、サーバのメンテナンスがてら、ApacheやPHPのバージョンを上げたりいろいろしているのですが、その課程でCakeのパフォーマンス問題を目の当たりにしました。

当方のサーバは大変に非力で、セレロンな512MBメモリのサーバです(一応専用ですが)。abで調査してみると、某連想くんなサイトは20リクエスト/秒出ません(涙)。
どんなに非力でも100位は出るだろうと思っていたのですが…とんでもなかったです。Apacheのmpmも相当いじりましたが、サーバを硬直させないようにするのに精一杯といった感じです。

というわけで、「連想くん」を本サービスとして稼働させるには、いくつかの対策をたてなければならないです。

【対策案】
1:100倍は速いサーバに載せ替える(赤どころではない)
2:ビューキャッシュを用いる
3:そもそもCakeをやめる

正直、1は現実的でないです。懐が大変に厳しくて…
誰か恵んでください(^^;;;。

2については、サイト構成の改良が必要になりそうです。当方の作り方として、フォームのバリデーションを呼び出し元に置いて、OKなら目的ページへリダイレクトしているので、キャッシュを効かせるとバリデーションとリダイレクトがされなくなってしまいます。なので、キャッシュの効かない別ページで処理をさせるといった手法が必要になりそうです。ただ、アクセス数の多いトップページなどはこのやり方が有効ですが、トータルではあまり解決になっていないかも。

ということは、真面目に3を考えなければならないかもしれません。
正直「連想くん」はそれほど複雑ではなく、ぶっちゃけCakeなしで出来てしまうものなので、3は問題のないレベルです。しかし、現時点で企画が進行している次のサービスについては、フレームワークがあることで大変に開発が簡素化できる内容であり、3を非常に考えにくい…

最近Cakeのフォーラムでも話題が上がっているのですが、ディスパッチャあたりの処理が大変に重いとのことで、ソースを眺めてみると、確かにその片鱗が伺えます。なんというか、同じ関数を何度も呼びに行っていたりとか、たかだかパスを作るのに凄い複雑な処理を走らせているとか。結構無駄がありそうです。

1.2になって、いろいろと仕様が増えているのですが、正直過剰になってきているような気がします。例えばimportとかも、require_onceで済むような内容についても構わずものすごい処理が走ります。

ここに来て、いろいろドキュメントを残したり、ツールを作ったりしていて言うのもなんですが、なんでもCake 、というのはどうかと思い始めてきました。
公開用のサービスは、やはりパフォーマンスを考えてピュアPHP、というのも選択肢の一つに入れておいた方が良さそうです。
管理ツールなどは、リクエスト数など気にしなくても大丈夫ですし、特にアソシエーションが管理機能の実現にマッチしていると思いますから、Cakeは結構有効だと思います。

公開サービス向けの、Cakeまで大げさでない、簡素なフレームワークがあると良いですね。
Cake側でパフォーマンスチューニングしてくれると一番良いんですけど…

なんかCakeを悪者のように書いてしまっていますが、これはSynfonyを使ってもZendFrameworkを使っても同じような問題に直面するはずです(使っていないので何とも言えないですけど)。フレームワークは一般的に、作りやすくする反面パフォーマンスを犠牲にしますからね。

話は大きく変わって「連想くん」ですが、新しいバージョンになり、連想単語の入力が不要になりました。自分で言うのもアレですが、使い方次第でなかなか面白いサービスだと思います。連想単語をさらに連想検索できるので、さかのぼっていくと良い暇つぶしが出来ます(笑)。
DBのデータの持ち方を変える必要が出てきたので、そこを修正しなければならないのですが、DB関連を外したものをまず公開してしまおうかとも。今日明日中にアップデートしてみます。


“【CakePHP】Cakeのパフォーマンス問題を目の当たりにした!” への4件の返信

  1. お疲れ様です。
    CakePHPの開発姿勢については、前から言われていることですが、「まず動作するものを作る、次にパフォーマンスを上げる」という順番だそうです。時期的には、パフォーマンスの段階に来ているそうなので、少しは改善されるのではないか・・・・と期待しています。

  2. shunさん、いつもお世話になっております。

    現在の暫定トップページは、いわゆる「1枚のHTMLファイルを表示」しているだけなんですけど、それでも28req/secしか出ていないんですよ。キャッシュをonにすれば一応100近く出ますが。
    しかしトップページには、これからDBアクセスして人気単語を表示する仕組みをこれからつけるので、キャッシュの対処はしにくいんですよね…

    ちなみに、layoutとビューを合成したものを表示するだけのPHPファイルは、900req/sec出るので、ほぼ同じ動作であるにもかかわらずこれだけの差が出るのは、やはり問題だと思うのです。

    RC2はshunさんのおっしゃるとおり、確かに機能の入れ込みが終わった段階でしょうから、チューニングはこれからされるだろうと期待したいです。まあでも、当面の問題としては深刻でして…今ハイブリッド型が頭の中をよぎっています。

  3. 「layoutとビューを合成したものを表示するだけのPHPファイルは、900req/sec出るので、ほぼ同じ動作であるにもかかわらずこれだけの差が出るのは、やはり問題」ですね。あまりにスピードが違いすぎるので、コーディングもチェックしたほうがよいか・・・は分かりませんが、参考まで。

    とりあえず思いつく高速化としては、
    ・Zend OptimizerかAPCは必ずインストールする。無料で倍速。
    ・キャッシュを上手に使う。期限も決められますので。
    ・requestAction()などは出来る限り避けるべき。

    なんかですね。うまくいくといいですね!

  4. アドバイスありがとうございます。

    実は、対象アクションはほぼ何もしていないのです。モデルが5つ、コンポーネントが1つ定義されていますが、これらは呼んでいません。なので、若干数値に変化はあるかもしれませんが、それを抜きにしたとしても、900に近づくのはかなり難しいです。yandoさんが以前パフォーマンス表みたいのを公表されていましたが、ピュアPHPとCakeで10倍以上差が出ていたので、その傾向になるのであれば、90位に近づいてくれるといいんですが。

    また、requestActionは使っていませんし、apcは導入済みです。それから、Apacheにmemcacheも入れています。ZendOptimizerはまだなので、導入してみることにします。

    他の記事にも書いているのですが、ピュアPHPとのハイブリッド化も考えています。DBを呼ぶ部分を工夫しなければなりませんが、何もしないページはハイブリッド化は有効ではないかと。モデルやヘルパーなどが単品で呼べるといいんですが(^^;。もっとも公開ページにおいて、DBを使いフレームワーク化が有効なページほど、アクセス数も多くボトルネックになりやすいのですが…

コメントは受け付けていません。