プロファイリングは、プログラムのパフォーマンスを観察するために使用されるテクノロジーであり、プログラムのボトルネックやリソース不足を発見するのに非常に適しています。プロファイリングでは、プログラムを深く掘り下げて、リクエスト処理プロセスのコードの各部分のパフォーマンスを表示することができます。同時に、問題のあるリクエスト (リクエスト) を特定し、パフォーマンスの問題が発生している場所を特定することもできます。リクエスト内で発生します。 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 コマンドがない場合は、次のコマンドを使用してインストールできます:
リーリー
リーリー
リーリー
pecl を再度使用して、xhprof 拡張機能をインストールします。このプログラムは現在ベータ版のみであるため、インストールコマンドは次のとおりです:
リーリー
この時点で、コマンドラインで php -m コマンドを実行することで、これらのモジュールが正しくインストールされていることを確認できます。 Web インターフェイスでこれらの拡張機能を有効にできるように、Apache を再起動することを忘れないでください。
XHGuiをインストール
XHGui 自体は主に Web ページで構成されており、XHProf 拡張機能によって収集されたデータにより使いやすいインターフェイスを提供します。リポジトリ GitHub リポジトリからクローンを作成することも、zip ファイルを直接ダウンロードして解凍することもできます。プログラムを入手したら、キャッシュ ディレクトリに十分な権限があり、Web サーバーがファイルを書き込む権限を持っていることを確認してください。最後に、インストール スクリプトを実行します:
リーリー
これはプログラムのインストールに必要なすべてであり、一部の依存プログラムは自動的にインストールされます。例外が発生した場合は、インストーラーからもプロンプトが表示されます。
リーリー
(Apache を再起動することを忘れないでください)。すべてがうまくいけば、XHGui URL に通常どおりアクセスして、次のコンテンツを確認できます:
仮想ホストで XHGui を起動します
此时,我们希望启动XHGui以便检验我们网站的性能。注意,性能测试最好在进行任何优化之前执行一次,以便检测优化的效果。最简单的方法是在虚拟主机中增加auto_prepend_file声明,如下图所示:
<VirtualHost *:80> ServerName example.local DocumentRoot /var/www/example/htdocs/ php_admin_value auto_prepend_file /var/www/xhgui/external/header.php <Directory /var/www/example/htdocs/> Options FollowSymLinks Indexes AllowOverride All </Directory> </VirtualHost>
一切就绪之后,你可以开始剖析网站的请求。XHGui只会剖析网站请求的1%,所以为了使XHGui获取有意义的数据,你需要让XHGui运行一段时间或者使用类似Apache Bench的测试工具批量提交一批请求。为什么在100个请求当中XHGui只会剖析一个?因为XHGui的设计初衷就是足够的轻巧以便在生产环境中使用,它不想对每一个请求产生额外的开销,1%的采样率已经能够为网站的总体流量提供较为清晰的概览。
满足数据
我使用测试虚拟机运行本文所有的示例,采用Joind.in API作为测试代码。为了产生一些流量,我将API测试案例运行了几遍。你也可以在一定负载的情况下收集数据,所以你可以在压力测试时使用XHGui,你甚至可以在上线站点中使用XHGui收集数据(听起来很疯狂,但是Facebook正式为了此应用才开发了该工具)。在向应用发送了一定的请求之后,重新访问XHGui,现在它就已经保存了一些数据:
该图向我们展示了XHGui为我们分析的每一个请求,最新的请求排在第一位,并且为每一个请求展示了一些额外信息。这些信息包括:
为了获取每一遍请求("run")更为详细的信息,你可以点击每一个请求你感兴趣的列。你可以点击URL以便获取该URL所有请求的详细信息。无论哪种方法,你都可以获取该请求更为详细的信息:
这是一个非常长并且非常详细的页面,所以我引用了两个截图(如果展示所有的信息将需要5个截图)。上面一幅图的左边部分展示了该请求相关的一些信息,以便帮助你跟踪这些统计信息与哪些方面有关;右边的主要部分展示了最消耗时间的各部分以及在请求过程中每个函数调用所消耗的内存。在图的下方有一个主键以表明每一栏。
第二幅图展示了该请求每一个组成部分更为详细的信息。我们可以看到每一部分调用的次数以及时间消耗,还包括CPU和内存信息。无论是inclusive还是exclusive信息都做了详细的展示:exclusive表示仅仅是该方法调用所产生的消耗;inclusive不仅包括本函数所产生的消耗,还包括本函数调用的其他函数所产生的消耗。
XHGui另一个特性是“调用图”(Callgraph),“调用图”以生动的虚拟方式展示了时间是如何消耗的:
这很好的展示了函数调用的层次。最好的一点是,该图是可交互的,你可以拖拽以更好的查看连接;你还可以用鼠标滑过“圆环”(blob)以查看更多的信息。当你与它交互时,他会很好玩的弹回和移动,这不是一个非常重要的特性但却让我感觉非常好玩。
理解数据
拥有大量的统计数据非常重要,但是你很难知道从哪里下手。对于一个性能不如预期的页面采用如下步骤:首先,对每一个函数的exclusive CPU时间进行排序,查看最消耗时间的函数列表。分析这些耗时的函数调用并进行重构和优化。
一旦做出了修改,让剖析工具再次检验新版本的程序,测试性能的改进。XHGui内置了完美的工具以比较两次运行;点击详细信息页面右上角的“Compare this run"按钮即可。该按钮会向你展示该URL每一次测试的结果,从中选择一个你要比较的对象。对你想比较的对象,点击”compare“按钮,XHGui将会转向比较视图,如下图所示:
統計表には、各情報の変更の実際の数と割合を含む、統計情報の新バージョンと旧バージョンの主な違いが表示されます。上の図は、新バージョンのリクエスト待ち時間が旧バージョンのわずか 8% であることを示しています。統計表には、各統計情報の詳細な変化が表示されます。これは「詳細」ページでよく確認されます。任意の列をソートして、興味のある情報を見つけることができます。
1 つの領域でリファクタリングが成功したら、詳細ページをチェックして新しいバージョンが実際にどのように動作するかを確認し、最適化する他の領域を選択します。アプリケーションの全体的なパフォーマンスを最大化する機能を選択して最適化するには、メモリ使用量または排他的経過時間で並べ替えてみてください。同時に、呼び出し数を確認することを忘れないでください。関数を繰り返し呼び出すと、最適化後にプログラムのパフォーマンスが飛躍的に向上します。
最適化手法
結果を定量化する前に、どれだけ改善したかを知るのは困難です。そのため、私たちはアプリを最適化する前にテストすることがよくあります。そうでない場合、アプリが本当に最適化されているかどうかをどうやって知ることができるのでしょうか?また、実際のデータのセットをどのように表現すべきかについても考える必要があります。そうしないと、不可能な目標に向かってしまう可能性があります。非常に便利な方法は、最適なデータ構造と使用する必要のある最小のストレージ容量を見つけるために最善を尽くすことです。好みの作業環境で「Hello world」プログラムを 0.5 秒で実行できない場合は、同じツールで構築された Web ページが適切に動作することを期待しないでください。
上記の説明はプログラミング フレームワーク (フレームワーク) を軽視しているわけではありません。プログラミング フレームワークは使いやすく、迅速な開発をサポートし、保守が容易であるために存在します。手動でコードを記述する場合と比較して、プログラミング フレームワークのパフォーマンスが低下するのは、あらゆる面で妥協した結果です。アプリケーション開発にプログラミング フレームワークを使用すると、必要に応じてプロファイリング ツールを使用してプログラムのパフォーマンスを分析し、改善することができます。たとえば、Zend Framework 1 の多くのモジュールは非常に強力な機能を提供しますが、非常に時間がかかります。プロファイリング ツールを使用すると、パフォーマンスの低い部分を特定して置き換えることができます。他のすべてのフレームワークにも同様の問題があり、XHGui は問題の場所を示し、それがアプリケーションに定量的な影響を与えているかどうかを確認できます。
プログラムの外では、遅かれ早かれ、優位性を得るために他の戦略が役に立つかもしれません:
XHGui はあなたの友達です
XHGui はインストールが簡単で、使用するときにすぐに使用でき、出力は取締役会でプレゼンテーションできるほど優れています。これはアプリのバグを特定し、アプリが実際に動作する (または動作しない) ことを確認するのに役立ちます。これにはいくつかの繰り返しのプロセスが必要になる可能性がありますが、これまでに XHProf または XHGui を使用したことがあるかどうかに関係なく、時間をかけてアプリケーションで試してみることをお勧めします。その結果に驚かれることでしょう。