5

この非常に大きな CakePHP アプリ (約 20k 行のコード) を入手しましたが、これはあまりきれいではなく、ドキュメントもまったくありません。アプリは本番環境で実行されていますが、パフォーマンスに大きな問題があります。

サーバーは 8GB RAM のクアッド コアですが、アプリは 3 ~ 4 リクエスト/秒しか処理できません。これは非常に悪いことです。各リクエストは、4 つすべての CPU の約 20 ~ 30% を使用します。

のようなちょっとした負荷テストでもやってみるとab -n 100 -c 10 ...、平均7000msのレスポンスまで上がります。ただし、800MB 以上の RAM を作成したことはないので、微調整用に少なくとも 6GB の空き RAM があります。

問題は、動作する開発インスタンスをまだ作成できていないため、本番環境で調整する必要があることです...

ソースコードをあまり掘り下げずに、パフォーマンスを簡単に向上させるために何をお勧めしますか?

4

5 に答える 5

14

ステップ1:Webサーバーではなく、アプリケーションであることを確認します

Cake階層の外側に単純なhelloworldファイルを作成します

<?php
echo 'Hello World';

そして、それが実行されるのにかかる時間を確認してください。サーバー/ネットワークレベルで起こっていることをアプリケーションのせいにするのは簡単なこともあります。

test.php妥当な時間内にレンダリングすると仮定して、ステップ2に進みます。

ステップ2:すべてをバックアップする

プロダクションコードをいじることは常に危険なゲームです。修復できないものが破損した場合に備えて、データベースの完全バックアップを開始する前に、ケーキディレクトリツリー全体をコピーしてください。1日の作業が終わったら、本番ディレクトリとコピーの内容を(GUIツールまたはコマンドラインを使用して)比較します。

diff -r production-cake copy-of-cake

ステップ3:データベースはほとんどの場合LAMPスタックの最初のボトルネックです

PHPアプリケーションは、特に実際のSQLクエリの多くを隠すActiveRecordスタイルモデルを使用している場合に、多くのSQLクエリを生成します。クエリをファイルやデータベーステーブルに記録するようにCakeを設定することをお勧めします。これを行うためのいくつかの手順がここにありますが、データベースではなくフラットファイルやsyslogにログアウトすることをお勧めします。DBリクエストをデータベースに記録すると、ページの読み込みごとのクエリ数が2倍になります。

また、IPアドレスからのリクエストのみをログに記録するように、IPチェックを追加することをお勧めします。そうすれば、ロギングがアプリケーションの通常の実行を劇的に妨げることはありません。

これが整ったら、単一の要求を行い、生成されているSQLを確認します。パフォーマンスを向上させるためにキャッシュをドロップできる場所として、同じクエリが何度も繰り返されていることを確認してください。シーケンシャルクエリも探す

select * from foo where id = 5
select * from foo where id = 6
etc...

これは、舞台裏で何が起こっているのかを理解せずに、誰かがループでモデルをロードしていることを示しています。

ステップ4:データベースでない場合は、システムコール

データベースがボトルネックではなく、PHP / Apacheが正しく機能している場合、次に探すのはシステムコールです。砲撃は物事を成し遂げるための迅速で汚い方法ですが、それは非常に費用のかかる操作です。それらの1つまたは2つをループに入れれば、完了です。

top本番サーバーでまたはを実行psし、開始および停止しているプログラムを探してから、コードベースでそれらのコマンドを検索します。

ステップ4:すべてのコントローラーをコピーする

あなたは多くのコントローラーを持っているでしょう

/app/controllers/posts_controller.php
/app/controllers/other_controller.php
etc...

これはURLに対応します

http://www.example.com/posts/methodName
http://www.example.com/other/methodName
etc...

特定のリクエストをデバッグして、なぜそれが非常に遅いの かを理解する必要があるときはいつでも、コントローラーのコピーを作成してください。

/app/controllers/debugposts_controller.php

手動でリクエストします

http://www.example.com/debugposts/methodName

次に、必要な数のdebug/printステートメントをコントローラーファイルにスローできます。あなたが「運が良ければ」、元の開発者はおそらくコントローラーファイルに多くのロジックを詰め込んだでしょう。そのような状況であれば、「コードの半分をコメントアウトする」ゲームをプレイできるようになります。

于 2009-11-26T20:24:43.737 に答える
1

DEBUG レベルを設定して、app/config/core.php何が起こっているかを確認できます。欠点は、すべてのユーザーがそうなる可能性があることです。デバッグをオンにすると、遅いクエリを簡単に確認できます。そうでない場合は、SQL スロー クエリ ログをオンにして、カットオフを比較的低く設定します (Cake は一見単純な質問に答えるために非常に多くのクエリを実行するのが好きだからです)。

于 2009-11-26T19:42:29.623 に答える
0

問題は、動作する開発インスタンスをまだ作成できていないことです

これはあなたが解決する必要がある問題です。そのアプリをその環境にとらわれずに実行します (たとえば、すべての環境構成が 1 つのファイルにあり、そのファイルには環境構成のみが含まれていることを確認します)。これを解決したら、開発で好きなものをすべてハックできます。

于 2009-11-26T20:47:27.110 に答える
0

残念ながら、少し掘り下げるだけではうまくいかないと思います。ボトルネック、少なくとも負荷の原因となっているコンポーネントを特定する必要があります。たとえば、インデックスが適切に作成されていない mySQL テーブルへの大量のアクセスは、サーバーを非常に狂わせる可能性があります。私の経験では、これがパフォーマンスの問題のよくある理由です。

本当に最善の方法は、デバッグ/プロファイリング環境をセットアップすることですが、サーバーのプロセス リストから、誰がそのような負担を引き起こしているかを大まかに把握できるはずです。それは本当に PHP プロセスですか、それともデータベース アクティビティがありますか?

于 2009-11-26T19:33:45.120 に答える
0

ファイルシステム、メモリ、または CPU によってバインドされているかどうかを確認するには、 と を試しvmstatてくださいiostat。アプリで、まだ行っていない場合は、memcachedまたはAPCを使用して速度を上げます。また、xdebugをインストールしてコードをプロファイリングし、どこが遅いかを確認してください。多数の関数呼び出しは、長い実行時間と同様に、常に怪しいものです。それがあなたのデータベースであることがわかるかもしれません。いくつかのクエリにキャッシュを追加できるかもしれません。

于 2009-11-26T21:03:02.180 に答える