web-dev-qa-db-ja.com

実動サーバーでCPU時間が最も消費されるPHPまたはPerlスクリプトを診断する方法はありますか?

わずかに電力不足のサーバーでは、多くのロボットが同時にクロールすることがあります。 1つの解決策はWebサーバーにより多くの処理能力を投入することを検討することですが、一部のスクリプトは驚くほど最適化されていないことを強調しています。

私ができるようになりたいのは、リクエストごとにCPU時間を計算し、それらを最初に修正することに集中することです。 ApacheまたはPHPに組み込まれているものはありますか? MySQLは、サーバーに最も負荷のかかるクエリも識別する独自のメトリックを持っていると思いますか?

7
Rowland Shaw

多数のプロファイラーのいずれかを使用して、PHPプロファイリングを行うこともできます。私が好むのはXDebugです:

http://www.xdebug.org/docs/profiler

スクリプトを変更する必要はありません。

これにより、ボトルネックをすばやく指摘できます。また、MySQLの部分にも役立ちます。 MySQLには独自のレポート機能がありますが、スクリプトが同じ(クイック)クエリを1000回連続して実行する場合があります。 MySQLはこれを報告しませんが、XDebugから1ページだけ関数が何度も呼び出されていることに気付くでしょう。

開発サーバーで最初の調査を行うことができます。最適化の問題はすぐに現れます。実稼働ログから、最も訪問されたページを見つけ、最初にdevサーバーで分析します。

それでもプロダクションサーバーでプロファイリングを行う必要がある場合は、要求のサブセットに対してランダムに有効にして、負荷を最小限に抑えることを検討してください。ドキュメントから:

Xdebug.profiler_enable_trigger設定を1に設定してプロファイラーを選択的に有効にすることもできます。1に設定されている場合、XDEBUG_PROFILEという名前のGET/POSTまたはCOOKIE変数を使用してプロファイラーを有効にできます。

Apache mod_rewriteは、ユーザーとの間で渡されることなく、GET変数を透過的に追加するのに役立ちます。

6
Erion

これを実現する方法はいくつかあります。最終的には、どの方法が最善であるかは、ソリューションに専念する時間と労力に依存することになります。

PHPベンチマーク:コードにまだベンチマークが含まれていない場合は、時間と労力がかかります。コードのスニペットを追加して、各スクリプトの開始時に時間とマイクロタイムのタイマーを設定し、スクリプトの終了時に経過した合計時間とマイクロタイムを(呼び出されたURIとともに)ログに記録します。後でコードをリファクタリングする必要がある場合は、特定の関数のベンチマークタイマーを追加できます(すべての通常の操作がafterになるまで待つことを忘れないでください)ベンチマークデータの書き込みが完了している-それ以外の場合は、ベンチマーク情報に干渉します)。

wget Benchmarking:おそらくベンチマークへの最も遅延な方法。 Webサーバーのログから要求されたURIのリストを取得し、それらをWebサーバーに対するローカル要求としてwgetにフィードします(理想的な結果を得るためにトラフィックが非常に少ない間にこれを数回行うことが理想的です)

2
danlefree