ホームページ >バックエンド開発 >PHPチュートリアル >PHP パフォーマンス分析パート 2: Xhgui の詳細
[前書き] これは、有名な海外ブロガーである Davey Shafik によって書かれた PHP アプリケーションのパフォーマンス分析シリーズの 2 番目の記事です。最初の記事では Xhprof/Xhgui を紹介し、3 番目の記事ではパフォーマンス チューニングの実践に焦点を当てています。
最初の記事では、xhprof の予備的な紹介と、アナライザーのインストールと実行方法を説明しました。この記事では、xhprof データを確認および比較するためのユーザー インターフェイス (UI) である Xhgui を紹介します。
Xhgui を使用するXhgui は、パフォーマンス評価を支援する多くの機能を提供しており、単一の実行と集約された環境の両方に適しており、特定の問題を特定し、傾向を発見することができます。
Xhgui の使用効率を向上させるには、次の多くの用語に精通する必要があります:
1.呼び出し数
関数呼び出し数
2.[含む] 実際の実行時間( wt)
関数の実際の実行 Time
3.[含まれる] CPU 使用量/CPU 時間 (cpu)
この関数の実行に使用される CPU 時間
4.[含まれる] メモリ使用量 (mu)
この関数によって現在使用されているメモリ量
5. [含む] ピークメモリ使用量 (pmu)
関数別のピークメモリ使用量
6. 排他的実実行時間 (ewt)
7. 排他的 CPU 時間 (ecpu)
8. 排他的メモリ使用量 (emu)
9. ピーク排他的メモリ使用量 (epmu)
項 2 から 5 は、関数とそのサブ関数の呼び出しをカウントする包括的な測定値です (必ずしも明示されているわけではありません)。項 6 から 9 は特殊なメトリクスであり、関数自体のリソース呼び出しのみをカウントします。すべての測定値は、この関数を呼び出した後の累積値です。 (たとえば、関数が 2 回呼び出された場合、1 回目は 900 ミリ秒かかりますが、2 回目はキャッシュのため 40 ミリ秒しかかかりません。最終的に表示される時間は 940 ミリ秒です)。開始準備完了
最近の実行 (ページネーション)
最長の実行時間 ? 実際の実行時間に基づいて最も遅い実行から並べ替えます
最も多くの CPU 時間を消費する実行から並べ替えます
最も多くのメモリを消費する実行から並べ替えますカスタム ビュー? クエリを定義して mongo DB を実行します
関数を監視します
ウォーターフォール 実験ビューから同時リクエストの相互作用を表示します
このチュートリアルでは、分析することを選択しましたWordPress で構築された Web サイトのパフォーマンス。インターネット上の Web サイトの 18% 以上は Wordpress 上に構築されており、Wordpress のパフォーマンスの小さな改善でも大きな影響を与える可能性があります。
実行のパフォーマンス データを表示する
いくつかのページのパフォーマンスを分析 (またはファイルをインポート) した後、Xhgui:
実行のパフォーマンス データを表示するには、日付をクリックするだけです。
適切なヘッダーをクリックすると、実際の実行時間 (wt)、CPU 時間 (CPU)、メモリ使用量 (mu)、またはピーク メモリ使用量 (pmu) に基づいてこれらの実行を表示できます。これにより、最も遅いページを簡単に見つけることができます。
1 つのパフォーマンス ページにかなりの量の情報が表示されます。左側には、全体的な実行状況のほか、GET (または POST) データやサーバー データを含むランタイム環境データが表示されます:
テーブルリストの詳細 関数名、呼び出し数、特定の実実行時間 (ewt)、特定のメモリ使用量 (emu)、および特定のメモリ使用量のピーク (epmu) が表示されます。さらに、ページの上部に「View Callgraph」と「Compare this run」という 2 つのボタンがあることに気づくでしょう。
次に、2 つの写真を見てみましょう。図 1 は、実際の実行時間が最も長い 6 つの関数を示しています。この時間は、関数自体に費やされた時間です (サブ関数呼び出しに費やされる時間を除く)。図 2 は、メモリ使用量が最も多い 6 つの関数を示しています。これらのグラフは、多くの場合、パフォーマンスのボトルネックを示している可能性があります。
機能の詳細は以下に記載されています。画像内の円柱の上でマウスをスライドさせると、この情報がプロンプト ボックスにも表示されます。
最後に、パフォーマンス アナライザーによって収集された一括情報が表示されます?? 関数リスト:
テーブルにはフローティング タイトル バーが含まれています (マウスが下にスクロールしても、列は画面の上部に残ります)。これには、関数名、呼び出し回数、および前述の特定かつ包括的な測定値が含まれます。
デフォルトでは、テーブルは実際の実行時間によって並べ替えられ、最長時間が最初にリストされます。メモリ使用量を調べたい場合を除き、最も遅い関数をすぐに特定できるため、通常はこの順序を変更する必要はありません。
機能の動作を確認したい場合は、機能をクリックすると詳細ページにジャンプします。このページには、最初に関数自体の詳細が再帰的に表示されます。次に、「親関数」セクションには、関数を直接呼び出すすべての関数がリストされます。最後に、「子関数」には、この関数が直接呼び出す他の関数がリストされます。
親関数は、特定の実際の実行時間に従って標準リスト データをリストします。
関数自体の実行が遅いのか、それとも関数の呼び出し回数が多すぎるために累積実際の実行時間が長すぎるのかを判断する必要があります。関数の呼び出し回数を確認し、その親関数のリストを遡って確認します。
関数呼び出しの数が問題ないと思われる場合は、サブ関数の動作を確認する必要があります。これは関数の実行に時間がかかる部分です。
サブ関数は測定値を含むもののみが表示されています。これは、最長のコード パスをすばやく見つけたいためです。
各サブ機能をクリックして、同じ詳細ビューにドリルダウンし、同じ分析を実行できます。
Xhgui の最大の機能は、2 つの異なる実行を比較することです。これにより、次のことが可能になります:
システムを変更し (opcache、mysql クエリ キャッシュを有効にするなど)、結果を比較
コードを変更し (コードまたは SQL の最適化)、結果を比較
異常な操作を比較「通常の」操作 比較
2 つのランタイムを比較するには、まずベースランを選択する必要があります。日付をクリックすると、実行の詳細ページが表示されます。
次に、右上隅にある [この実行を比較] ボタンをクリックします:
同じ URL の下の実行リストにジャンプします。比較する 1 つを選択できます:
必要な実行をクリックします。 「比較」ボタンをクリックすると比較ページにジャンプします。
比較ビューには、2 つの実行間の違いのみが表示されます。ページ上部の比較で 2 つの実行を表示し、並べ替えの変更を支援するいくつかのボタンも表示します。
次に概要を示します:
この表の情報はすべて役に立ちますが、特に注意すべき 2 つの違いは、「関数呼び出しの数」と「排他的な実際の実行時間」です。
関数呼び出しの数の違いは、2 つの実行間の重要な違い、つまりコード パスまたはキャッシュの違いを示唆しています。最初の違いは意図的な最適化によるものである可能性がありますが、それが目的ではない場合、2 つの実行を比較することはおそらくあまり意味がありません。一方、キャッシュはパフォーマンスを向上させるための有益かつ効果的な方法です。この比較により、キャッシュが発生しているかどうかを簡単に確認できます。
実際の実行時間を含むパーセンテージの差は、パフォーマンスチューニングの実際の結果を示します。理想的には、最初の実行時間と比較して 2 回目の実行時間のパーセンテージが小さくなるはずです。スクリーンショットでは、2 回目の実行に要した時間は最初の実行の 79% のみで、これはパフォーマンスが 21% 向上したことを示しています。
最後に、機能の詳細を確認します。
このビューでは相違点のみが示されていることに注意してください。差は負の数が緑色、正の数が赤色で表されます。 (負の数値は、呼び出しが少ない、実際の実行時間が短い、CPU 時間が短い、またはメモリ消費量が少ないことを示します) 差がない場合は、灰色の 0 として表示されます。
他のテーブルと同様に、デフォルトの順序は関数の呼び出し順序です。
ここでは、加えた変更が実際に有効かどうか、また期待どおりの効果があるかどうかを確認できます。このビューを使用して、パフォーマンス低下の原因を追跡することもできます。
パフォーマンス向上の良い例は、1 つの条件に基づいて 1 つの関数だけを呼び出すことです。たとえば、これを以前に行ったことがある場合は、データをフィルターする必要はないかもしれません。
この変更を行うと、フィルター関数の呼び出しが減り、パフォーマンスが向上することが期待できます。
これらの両方と、その他の予期しない理由がここで確認できます?? あなたの状態がフィルター自体よりも時間がかかっていますか?この場合、パフォーマンスに悪影響が生じます。
ここでは、NOOP_Translations::translate と apply_filter の両方の呼び出し数が減少していますが、apply_filter の排他的メモリ使用量が 133560 バイト増加していることがわかります。
私にとって、Xhgui の最も強力な機能はトレンドの表示です。 xhprof はパッシブ プロファイラーであり、すべての環境 (開発、QA、ステージング、運用) で有効にできるため、トラフィックを継続的にサンプリングして分析できます。
特定の URL のすべてのデータを確認するには、実行リスト内でその URL をクリックするだけです:
これにより、その URL の実行ページにジャンプします。
このページには 2 つの重要なチャートが表示されます。 1 つ目は実際の実行時間と CPU 時間を示し、2 つ目はメモリ使用量とピーク メモリ使用量を示します。これらのグラフ リストの実行データには、各実行の URL、時間、実際の実行時間、CPU 時間、メモリ使用量、スパイクが含まれます。
これらのグラフは、傾向と異常値を確認するための鍵となります。しかし、この情報をどうすればよいでしょうか?
異常なデータがある場合は、まずその上にマウスを移動してその身元を確認し、その後、その 1 回の実行を確認できます。または、他の通常の操作と比較して違いを見つけます。
トレンドについては、そのトレンドがいつ始まったかを確認するのが最善の策です。この時点でキャッシュを追加しましたか?キャッシュがより完全になるにつれて、全体的な傾向は下降するはずです。または、キャッシュが無効になり、キャッシュの再構築中に増加傾向が見られます。
デフォルトでは、これらのグラフには過去 100 件の実行が表示されます。次のページをクリックすると、より長い実行を表示できます。
さらに、検索ボタンをクリックして、表示されるインターフェースをカスタマイズできます:
このボタンをクリックすると、検索フォームが表示されます:
特定の日付間のランを検索できます。過去 30 分、1 時間、2 時間、12 時間、24 時間、1 週間、2 週間、または 30 日以内の実行を表示することもできます。パフォーマンス チューニングの結果を評価するには、より短い時間間隔が適しています。
最後に、PHP の DateTimeIntervalInterval 正規形式を使用してカスタムの時間間隔を指定できます。たとえば、過去 2 日間は P2D を使用し、最後の 15 分は PT15M を使用できます。
ウォッチ関数を使用すると、正規表現を通じて特定の関数または関数のグループを識別し、それらを単一の実行ページに表示できます (上記を参照)。
正規表現を使用できるため、モジュールまたは拡張機能内の関数を簡単に表示できます。
たとえば、すべての MySQL アクティビティを監視するには、次のいずれかを追加するだけです:
たとえば、すべての MySQL アクティビティを監視するには、次のいずれかを追加するだけです:
Xhprof の最後の部分は、実行中のコードの実行パスを示すコール グラフです。
コール グラフでノードをドラッグ アンド ドロップすると、データが見やすくなります。各クリックの上にマウスを置くと、実際の実行時間が表示され、関数の詳細ページに入ることができます。
図をより直感的に表示するには、次をクリックしてください:
OneAPM オンライン PHP アプリケーション パフォーマンス分析 SaaS サービスの無料使用を体験してください!
次の章
最後の 3 番目のパートでは、xhprof データを使用してコードを最適化します。コードを最適化するための他のツールについても簡単に紹介します。
(この記事は、アプリケーションパフォーマンス管理のリーディングカンパニーである OneAPM のエンジニアによって編集および編集されました)