プロファイリングは、プログラムのパフォーマンスを観察するために使用されるテクノロジーであり、プログラムのボトルネックや逼迫したリソースを発見するのに非常に適しています。プロファイリングでは、プログラムを深く掘り下げて、リクエスト処理プロセスのコードの各部分のパフォーマンスを表示することができます。同時に、問題のあるリクエスト (リクエスト) を特定し、パフォーマンスの問題が発生している場所を特定することもできます。リクエスト内で発生します。 PHP にはさまざまなプロファイリング ツールがありますが、この記事では主に、非常に優れたツールである XHGui に焦点を当てます。 XHGui は XHProf (XHProf は Facebook によってリリースされています) に基づいて構築されていますが、分析結果のためのより優れたストレージとより優れた情報取得インターフェイスが追加されています。この点で、XHGui はまったく新しいツールのようなものです。 XHGui は何度か改良を重ねてきましたが、現在のバージョンではより美しいユーザー インターフェイスが提供され、プロファイリング結果の保存に MongoDB が使用されています。以前のバージョンと比較すると、これらすべての点が大幅に改善されています。以前のバージョンは、データを保存するためにファイルを使用する開発者向けの設計に近く、収集されたデータの使用が非常に困難だったためです。 XHGui 2013 は、管理者と開発者の両方にとって非常に包括的なプロファイリング ツールであると同時に、運用環境で実行できるほど軽量になるように設計されています。 この記事では、プログラムのインストールを段階的に説明し、このツールを使用して収集できる情報のあらゆる側面を示します。 ステップ 1: 依存関係をインストールする XHGui にはいくつかの依存関係があるため、最初のステップはこの問題を解決することです。以下のすべてのチュートリアルは Ubuntu 13.04 プラットフォームに基づいています。もちろん、それらを調整して独自のプラットフォームに適用できるはずです。現時点では、MongoDB、PHP をインストールし、PECL 拡張機能をインストールする機能が必要です。 まず、MongoDB をインストールする必要があります。ここにいくつかの公式インストール チュートリアルがあり、システムに関連する詳細を見つけることができますが、今のところは単純に APT を介してインストールします。
同時に、PHP 用の Mongo ドライバーも必要です。リポジトリ内のドライバーのバージョンは少し古いため、今日のデモでは Pecl から入手します。マシンに pecl コマンドがない場合は、次のコマンドを使用してインストールできます:
extension=xhprof.so この時点で、コマンドラインで php -m コマンドを実行することで、これらのモジュールが正しくインストールされていることを確認できます。 Web インターフェイスでこれらの拡張機能を有効にできるように、Apache を再起動することを忘れないでください。
XHGuiをインストール XHGui 自体は主に Web ページで構成されており、XHProf 拡張機能によって収集されたデータにより使いやすいインターフェイスを提供します。コードベースの GitHub リポジトリからクローンを作成することも、zip ファイルを直接ダウンロードして解凍することもできます。プログラムを入手したら、キャッシュ ディレクトリに十分な権限があり、Web サーバーがファイルを書き込む権限を持っていることを確認してください。最後に、インストール スクリプトを実行します:
これはプログラムのインストールに必要なすべてであり、一部の依存プログラムは自動的にインストールされます。例外が発生した場合は、インストーラーからもプロンプトが表示されます。 XHGui を仮想ホストにインストールすることを好みます。これには、.htaccess ファイルが許可され、RUL 書き換えが有効になる必要があります。 URL 書き換えの開始は、mod_rewrite モジュールを開始し、次のコマンドを渡す必要があることを示します:
(Apache を再起動することを忘れないでください)。すべてがうまくいけば、XHGui URL に通常どおりアクセスして、次のコンテンツを確認できます: 仮想ホストで XHGui を起動します この時点で、Web サイトのパフォーマンスをテストするために XHGui を起動したいと思います。最適化の効果を検出するには、最適化の前にパフォーマンス テストを実行するのが最適であることに注意してください。最も簡単な方法は、以下の図に示すように、仮想ホストに auto_prepend_file ステートメントを追加することです。
すべての準備が完了したら、ウェブサイトのリクエストの分析を開始できます。 XHGui がプロファイリングするのは Web サイト リクエストの 1% のみであるため、XHGui が意味のあるデータを取得するには、XHGui を一定期間実行するか、Apache Bench などのテスト ツールを使用してリクエストのバッチをバッチ送信する必要があります。 XHGui が 100 件のリクエストのうち 1 件しか解析しないのはなぜですか? XHGui は運用環境での使用に十分軽量になるように設計されており、リクエストごとに追加のオーバーヘッドが発生することを望まないため、1% のサンプリング レートで Web サイト全体のトラフィックのより明確な概要をすでに提供できます。 データを確認する この記事のすべての例を実行するためにテスト仮想マシンを使用し、テスト コードとして Join.in API を使用します。トラフィックを生成するために、API テスト ケースを数回実行しました。負荷をかけた状態でデータを収集することもできるので、ストレス テスト中に XHGui を使用することもできます。また、XHGui を使用してライブ サイトでデータを収集することもできます (クレイジーに聞こえるかもしれませんが、Facebook はこのアプリケーション用にこのツールを公式に開発しました)。特定のリクエストをアプリケーションに送信した後、XHGui に再度アクセスすると、データが保存されています。 このグラフは、XHGui が分析した各リクエストを示しています。最新のリクエストが最初にリストされ、各リクエストの追加情報が表示されます。この情報には次のものが含まれます:
これは非常に長く、非常に詳細なページなので、スクリーンショットを 2 枚引用しました (すべての情報を表示するには 5 枚のスクリーンショットが必要です)。上の図の左側には、これらの統計がどの側面に関連しているかを追跡するのに役立つ、リクエストに関連するいくつかの情報が表示されます。右側の主要な部分には、最も時間のかかる部分とリクエスト中の各関数呼び出しに費やされた時間が表示されます。プロセスのメモリが消費されます。グラフの下には各列を示す主キーがあります。 2 番目の図は、リクエストの各コンポーネントに関する詳細情報を示しています。 CPU やメモリの情報を含む、各部分の呼び出し数と消費時間を確認できます。包括的情報と排他的情報の両方が詳細に表示されます。排他的とは、メソッド呼び出しによって発生した消費のみを意味します。包括的とは、この関数によって発生した消費だけでなく、この関数によって呼び出された他の関数によって発生した消費も含まれます。
XHGui のもう 1 つの機能は、「コールグラフ」です。「コールグラフ」は、時間がどのように消費されるかを鮮やかな仮想方法で表示します。
これは関数呼び出しの階層をうまく示しています。最も良い点は、図が対話型であり、ドラッグして接続を詳しく確認したり、BLOB 上にマウスを移動して詳細を表示したりできることです。操作すると跳ねたりふざけて動いたりするので、それほど重要な機能ではありませんが、私にとってはとても楽しかったです。 データを理解する多くの統計を取得することは重要ですが、どこから始めればよいかを知るのは難しい場合があります。ページのパフォーマンスが期待したほど良くない場合は、次の手順を実行します。 まず、各関数の排他 CPU 時間を並べ替えて、最も時間を消費する関数のリストを表示します。これらの時間のかかる関数呼び出しを分析し、リファクタリングして最適化します。 変更を加えたら、プロファイリング ツールでプログラムの新しいバージョンを再度チェックして、パフォーマンスの向上をテストします。 XHGui には、2 つの実行を比較するのに最適なツールが組み込まれています。詳細ページの右上隅にある「この実行を比較」ボタンをクリックするだけです。このボタンには、この URL の各テストの結果が表示され、そこから比較するオブジェクトを選択できます。比較したいオブジェクトの「比較」ボタンをクリックすると、以下の図に示すように、XHGui が比較ビューに変わります。 統計表には、各情報の変更の実際の数と割合を含め、統計の新バージョンと旧バージョンの主な違いが表示されます。上の図は、新バージョンのリクエスト待ち時間が旧バージョンのわずか 8% であることを示しています。統計表には各統計情報の詳細な変化が表示されます。これは「詳細」ページでよく表示されます。任意の列を並べ替えて、興味のある情報を見つけることができます。 1 つの領域でリファクタリングが成功したら、詳細ページをチェックして新しいバージョンが実際にどのように動作するかを確認し、最適化する他の領域を選択します。メモリ使用量や排他的経過時間を並べ替えて、アプリケーション全体のパフォーマンスを最大化する機能を選択して最適化してください。同時に、呼び出し数を確認することを忘れないでください。関数を繰り返し呼び出すと、最適化後にプログラムのパフォーマンスが飛躍的に向上します。 最適化手法 結果を定量化する前に、どれだけ改善したかを知るのは困難です。そのため、アプリを最適化する前にテストすることがよくあります。そうでない場合、アプリが本当に最適化されているかどうかはどうやってわかりますか?また、実際のデータのセットをどのように表現すべきかについても考える必要があります。そうしないと、不可能な目標に向かってしまう可能性があります。非常に便利な方法は、最適なデータ構造と使用する必要のある最小のストレージ容量を見つけるために最善を尽くすことです。好みの作業環境で「Hello world」プログラムを 0.5 秒で実行できない場合は、同じツールで構築された Web ページが適切に動作することを期待しないでください。 上記の説明はプログラミング フレームワーク (フレームワーク) を軽視しているわけではありません。プログラミング フレームワークは使いやすく、迅速な開発をサポートし、保守が容易であるために存在します。手動でコードを記述する場合と比較して、プログラミング フレームワークのパフォーマンスが低下するのは、あらゆる面で妥協した結果です。アプリケーション開発にプログラミング フレームワークを使用すると、必要に応じてプロファイリング ツールを使用してプログラムのパフォーマンスを分析し、改善することができます。たとえば、Zend Framework 1 の多くのモジュールは非常に強力な機能を提供しますが、非常に時間がかかります。プロファイリング ツールを使用すると、パフォーマンスの低い部分を特定して置き換えることができます。他のすべてのフレームワークにも同様の問題があり、XHGui は問題の場所を示し、それがアプリケーションに定量的な影響を与えているかどうかを確認できます。
XHGui はあなたの友達です XHGui はインストールが簡単で、使用するときにすぐに使用でき、出力は取締役会でプレゼンテーションできるほど優れています。これはアプリのバグを特定し、アプリが実際に動作する (または動作しない) ことを確認するのに役立ちます。これにはいくつかの繰り返しのプロセスが必要になる可能性がありますが、これまでに XHProf または XHGui を使用したことがあるかどうかに関係なく、時間をかけてアプリケーションで試してみることをお勧めします。その結果に驚かれることでしょう。 |