今週は、サーバのメンテナンスがてら、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の開発姿勢については、前から言われていることですが、「まず動作するものを作る、次にパフォーマンスを上げる」という順番だそうです。時期的には、パフォーマンスの段階に来ているそうなので、少しは改善されるのではないか・・・・と期待しています。
shunさん、いつもお世話になっております。
現在の暫定トップページは、いわゆる「1枚のHTMLファイルを表示」しているだけなんですけど、それでも28req/secしか出ていないんですよ。キャッシュをonにすれば一応100近く出ますが。
しかしトップページには、これからDBアクセスして人気単語を表示する仕組みをこれからつけるので、キャッシュの対処はしにくいんですよね…
ちなみに、layoutとビューを合成したものを表示するだけのPHPファイルは、900req/sec出るので、ほぼ同じ動作であるにもかかわらずこれだけの差が出るのは、やはり問題だと思うのです。
RC2はshunさんのおっしゃるとおり、確かに機能の入れ込みが終わった段階でしょうから、チューニングはこれからされるだろうと期待したいです。まあでも、当面の問題としては深刻でして…今ハイブリッド型が頭の中をよぎっています。
「layoutとビューを合成したものを表示するだけのPHPファイルは、900req/sec出るので、ほぼ同じ動作であるにもかかわらずこれだけの差が出るのは、やはり問題」ですね。あまりにスピードが違いすぎるので、コーディングもチェックしたほうがよいか・・・は分かりませんが、参考まで。
とりあえず思いつく高速化としては、
・Zend OptimizerかAPCは必ずインストールする。無料で倍速。
・キャッシュを上手に使う。期限も決められますので。
・requestAction()などは出来る限り避けるべき。
なんかですね。うまくいくといいですね!
アドバイスありがとうございます。
実は、対象アクションはほぼ何もしていないのです。モデルが5つ、コンポーネントが1つ定義されていますが、これらは呼んでいません。なので、若干数値に変化はあるかもしれませんが、それを抜きにしたとしても、900に近づくのはかなり難しいです。yandoさんが以前パフォーマンス表みたいのを公表されていましたが、ピュアPHPとCakeで10倍以上差が出ていたので、その傾向になるのであれば、90位に近づいてくれるといいんですが。
また、requestActionは使っていませんし、apcは導入済みです。それから、Apacheにmemcacheも入れています。ZendOptimizerはまだなので、導入してみることにします。
他の記事にも書いているのですが、ピュアPHPとのハイブリッド化も考えています。DBを呼ぶ部分を工夫しなければなりませんが、何もしないページはハイブリッド化は有効ではないかと。モデルやヘルパーなどが単品で呼べるといいんですが(^^;。もっとも公開ページにおいて、DBを使いフレームワーク化が有効なページほど、アクセス数も多くボトルネックになりやすいのですが…