Ubuntu14.04でPHPアプリケーションをプロファイリングするためにXHProfとXHGuiを設定する方法
###序章
ソフトウェアエンジニアリングでは、プロファイリングは、アプリケーション内で発生する可能性のあるボトルネックとパフォーマンスの問題を特定するために、実行時にアプリケーションを分析するために使用される手法です。 これは、ソフトウェアの最適化に不可欠なリソースです。 プロファイリングは、アプリケーションをコードレベルで分析するという点でベンチマークとは異なりますが、ベンチマークは、エンドユーザーが経験するアプリケーション全体のパフォーマンスを分析することを目的としています。
プロファイラーは、アプリケーションに関する詳細情報を収集して、メモリ使用量、関数呼び出しの頻度と期間、リクエストへの応答時間などに関する統計と洞察に満ちたデータを生成するソフトウェアです。
XHProfは、PHPアプリケーションを分析するために設計されたプロファイラーです。 Facebookによって作成およびオープンソース化されたXHProfは、パッシブプロファイラーとして機能します。つまり、アプリケーションのパフォーマンスへの影響を最小限に抑えながらバックグラウンドで機能するため、実稼働環境での使用に適しています。
XHGuiは、XHProfを介して収集されたデータを視覚化するための豊富なインターフェイスを提供します。
このチュートリアルでは、Ubuntu14.04で実行されているPHPアプリケーションをプロファイリングするためにXHProfとXHGuiをインストールする方法を示します。
XHProfは現在PHP7をサポートしていません。 サーバーでPHP7を使用している場合は、代わりに tideways / php-profiler-extension を試すことができます。これは、XHProfのドロップイン代替として機能します。
##前提条件
このガイドに従うには、次のものが必要です。
- ルート以外のsudoユーザーがいるUbuntu14.04サーバー。これは、初期サーバーセットアップガイドに従ってセットアップできます。
- 分析されるPHPアプリケーションを実行する機能的なPHPWebサーバー環境
先に進む準備ができたら、sudoアカウントを使用してサーバーにログインします。 ##ステップ1—サーバーの依存関係をインストールする pecl
サーバーにインストールされている場合は、今すぐインストールする必要があります。 両方を取得するために必要になります xhprof
そしてその mongo
PHP拡張機能が設定されました。
まず、パッケージマネージャーのキャッシュを次のように更新します。
- sudo apt-get update
次に、インストールします pecl
とともに php-pear
パッケージ。 私たちも必要です php5-dev
PHPモジュールをインストールするために pecl
、 と php5-mcrypt
XHGuiを設定するため:
- sudo apt-get install php-pear php5-dev php5-mcrypt
を有効にするには mcrypt
拡張、実行:
- sudo php5enmod mcrypt
最後に、XHGuiをインストールするにはGitが必要です。 Gitがサーバーにまだインストールされていない場合は、次のコマンドで今すぐインストールできます。
- sudo apt-get install git
##ステップ2— XHProfをインストールするこれで、XHProfをインストールして有効にする必要があります。 経由でインストールするには pecl
、 走る:
- sudo pecl install xhprof-beta
次に、アクティベートする必要があります xhprof
拡大。 Ubuntu / Debianの標準を維持しながらこのプロセスを容易にするために、別の ini
構成ファイルを作成し、コマンドを使用して有効にします php5enmod
.
新しいを作成します ini
内部の構成ファイル /etc/php5/mods-available
:
- sudo nano /etc/php5/mods-available/xhprof.ini
このファイルには、次の内容を含めます。
extension=xhprof.so
モジュール構成ファイルを有効にするには、次のコマンドを実行します。
- sudo php5enmod xhprof
あとは、変更を適用するためにWebサーバーを再起動するだけです。 LAMP 環境(Apache)では、次の方法でこれを行うことができます。
- sudo service apache2 restart
LEMP 環境(Nginx + PHP5-FPM)では、再起動する必要があります php5-fpm
サービス:
- sudo service php5-fpm restart
The xhprof
これで、拡張機能がインストールされ、アクティブ化されます。 確認するには、次を実行できます。
- php --ri xhprof
出力は次のようになります。
Outputxhprof
xhprof => 0.9.2
CPU num => 1
##ステップ3— MongoDBをインストールする次のステップは、MongoDBと mongo
サーバーにインストールされているPHP拡張機能。 MongoDBは、XHGuiによって使用され、XHProfのアプリケーション分析によって取得されたデータを保存します。
MongoDBをインストールするには、以下を実行します。
- sudo apt-get install mongodb
MongoDB PHP拡張機能をインストールするには、以下を実行します。
- sudo pecl install mongo
インストールでは、MongoDBのエンタープライズ認証を有効にするかどうかを選択するために、ある時点で入力を求められます。 デフォルト値(no)のままにして、Enterキーを押すだけでインストールを続行できます。
次に、をアクティブ化する必要があります mongo
PHP拡張、私たちが使用したのと同じ手順に従います xhprof
拡大。 で新しい構成ファイルを作成します /etc/php5/mods-available/mongo.ini
:
- sudo nano /etc/php5/mods-available/mongo.ini
次の内容をファイルに含めます。
extension=mongo.so
モジュール構成ファイルを有効にするには、次のコマンドを実行します。
- sudo php5enmod mongo
次に、Webサーバーを再起動して、変更を適用します。 LAMP 環境(Apache)では、次の方法でこれを行うことができます。
- sudo service apache2 restart
LEMP 環境(Nginx + PHP5-FPM)では、再起動する必要があります php5-fpm
サービス:
- sudo service php5-fpm restart
The mongo
これで、拡張機能がインストールされ、アクティブ化されます。 確認するには、次を実行できます。
- php --ri mongo
出力は次のようになります。
Outputmongo
MongoDB Support => enabled
Version => 1.6.12
Streams Support => enabled
SSL Support => enabled
Supported Authentication Mechanisms
MONGODB-CR => enabled
SCRAM-SHA-1 => enabled
MONGODB-X509 => enabled
GSSAPI (Kerberos) => disabled
PLAIN => disabled
...
##ステップ4— MongoDBインデックスの設定(オプション)これはオプションですが、MongoDBからのデータを保存およびアクセスする際のXHGuiの全体的なパフォーマンスを向上させる推奨ステップです。
次のコマンドラインからMongoDBクライアントにアクセスします。
- mongo
ここで、XHGuiのインデックスを作成するために、次の一連のコマンドを実行します。
- use xhprof
- db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
- db.results.ensureIndex( { 'profile.main().wt' : -1 } )
- db.results.ensureIndex( { 'profile.main().mu' : -1 } )
- db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
- db.results.ensureIndex( { 'meta.url' : 1 } )
MongoDBクライアントを終了するには、次のコマンドを実行します。
- exit
##ステップ5— XHGuiをインストールする次のステップは、XHGuiをインストールし、Webサーバー上の仮想ホストとしてセットアップすることです。
まず、GithubからXHGuiリポジトリのクローンを作成します。 XHGuiのコンテンツをWebサーバー上の仮想ホストとして提供する必要があるため、複製されたリポジトリを内部に配置します /var/www
.
XHGuiディレクトリを通常のユーザーが所有するように設定することをお勧めします。 この例では、 sammy
ユーザー名とグループとして使用しますが、これらの値を独自のユーザー名とグループに置き換える必要があります。
- sudo mkdir -p /var/www/xhgui
- sudo chown -R sammy.sammy /var/www/xhgui
- cd /var/www
- git clone https://github.com/perftools/xhgui.git xhgui
XHGuiの依存関係をインストールするには、付属のインストーラーを実行します。
- cd xhgui
- php install.php
依存関係が正常にインストールされたら、次のコンテンツを提供するように仮想ホストを構成する必要があります。 xhgui
. 次のセクションでは、の仮想ホストを作成する方法について説明します xhgui
LAMP環境とLEMP環境の両方で。
###LAMPでのXHGuiの仮想ホストの設定
ApacheをWebサーバーとして使用する場合、最初に確認する必要があります mod_rewrite
有効になっています。 有効にするには、次を実行します。
- sudo a2enmod rewrite
下に新しい仮想ホストファイルを作成します /etc/apache2/sites-available
:
- sudo nano /etc/apache2/sites-available/xhgui.conf
このファイル内に次の内容を配置します。
[label /etc/apache2/sites-available/xhgui.conf]
<VirtualHost *:80>
DocumentRoot /var/www/xhgui/webroot
ServerName xhgui.example.com
<Directory "/var/www/xhgui/webroot">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
ドキュメントのルートがサブディレクトリを指している必要があることに注意してください webroot
XHGuiのメインディレクトリ内。
現在、この仮想ホストに使用できるサブドメインがない場合は、ダミーのドメイン名を使用して、ローカルにエントリを作成できます。 /etc/hosts
を指すファイル ServerName
サーバーのIPアドレスに設定します。 Apache仮想ホストを作成する方法の詳細については、 Ubuntu14.04でApache仮想ホストを設定する方法ガイドを確認してください。
次のコマンドで仮想ホストを有効にします。
- sudo a2ensite xhgui
変更を適用するには、次のコマンドでApacheをリロードします。
- sudo service apache2 reload
###LEMPでのXHGuiの仮想ホストの設定
で新しい仮想ホストファイルを作成することから始めます /etc/nginx/sites-available
:
- sudo nano /etc/nginx/sites-available/xhgui
このファイル内に次の内容を配置します。
server {
listen 80;
server_name xhgui.example.com;
root /var/www/xhgui/webroot/;
index index.php;
location / {
try_files $uri $uri/ /index.php?$uri&$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
ドキュメントのルートがサブディレクトリを指している必要があることに注意してください webroot
XHGuiのメインディレクトリ内。
現在、この仮想ホストに使用できるサブドメインがない場合は、ダミーのドメイン名を使用して、ローカルにエントリを作成できます。 /etc/hosts
を指すファイル server_name
サーバーのIPアドレスに設定します。 Nginx仮想ホストを作成する方法の詳細については、 Ubuntu14.04ガイドでNginxサーバーブロックを設定する方法を確認してください。
新しい仮想ホストを有効にするには、次のコマンドを実行します。
- sudo ln -s /etc/nginx/sites-available/xhgui /etc/nginx/sites-enabled/xhgui
ここで、Nginxを再起動して変更を適用します。
- sudo service nginx restart
##ステップ6— XHProfを設定するこの時点で、Webサーバー構成で指定したサーバー名にアクセスすることにより、ブラウザーからXHGuiのインターフェースにアクセスできるようになります。 まだプロファイリングデータの収集を開始していないため、次のようなページが表示されます。
XHProf拡張機能はすでにサーバーにインストールされていますが、アプリケーションのプロファイリングプロセスをアクティブ化する必要があります。 これは通常、実行中のすべてのPHPスクリプトにコードの一部を自動的に追加するPHPディレクティブをWebサーバーに含めることによって行われます。 デフォルトでは、XHProfはアプリケーションに対して行われた100件のリクエストのうち1件のみをプロファイリングすることを指摘することが重要です。
XHGuiは、アプリケーションのプロファイリングを初期化するためにスクリプトに追加できるデフォルトのPHPヘッダーを提供します。 このチュートリアルのすべての手順を実行した場合、ヘッダーファイルは次の場所にあるはずです。 /var/www/xhgui/external/header.php
.
次のセクションでは、Apache環境とNginx環境の両方でこのヘッダーファイルをすべてのPHPスクリプトに自動的に追加する方法を示します。 この例では、このサーバーのメインWebサイトとしてホストされているWordPressアプリケーションのプロファイリングを有効にします。
Apacheでのプロファイリングの有効化
プロファイルするWebサイトのApache構成ファイルを編集してみましょう。 この例では、このサーバーでホストされているメインのApacheWebサイトのプロファイリングを有効にします。 /etc/apache2/sites-available/000-default.conf
. 選択したコマンドラインエディタでこのファイルを開きます。
- sudo nano /etc/apache2/sites-available/000-default.conf
強調表示された行を既存の行に含めます <VirtualHost>
ブロック:
<VirtualHost *:80>
...
php_admin_value auto_prepend_file "/var/www/xhgui/external/header.php"
...
</VirtualHost>
ファイルを保存して終了します。 Apacheを再起動して、変更を適用します。
- sudo service apache2 restart
Nginxでプロファイリングを有効にする
プロファイルするWebサイトのNginx構成ファイルを編集してみましょう。 この例では、 default
このサーバーでホストされているWebサイト。 /etc/nginx/sites-available/default
. 選択したコマンドラインエディタでこのファイルを開きます。
- sudo nano /etc/nginx/sites-available/default
次に、方法を定義するブロックを探します .php
スクリプトが処理されます。 このブロック内に強調表示された行を含めます。
location ~ \.php$ {
...
fastcgi_param PHP_VALUE "auto_prepend_file=/var/www/xhgui/external/header.php";
...
}
ファイルを保存して終了します。 Nginxを再起動して、変更を適用します。
- sudo service nginx restart
##ステップ7—XHGui入門
これですべてが適切に設定されましたが、Webサイトが通常取得するビューの量によっては、最初のプロファイリングデータがXHGuiに表示されるまでに時間がかかる場合があります。 これは、デフォルトでXHProfが受信した100件のリクエストのうち1件のみをプロファイリングするという事実によるものです。 プロファイルデータが利用可能になる前に、Webサイトをナビゲートし、数回リロードする必要がある場合があります。
###XHGuiの概要
プロファイリング情報が利用可能になると、次のようなページが表示されます。
以下に、この概要表の各フィールドの簡単な説明を示します。
- メソッド:分析されたリクエストで使用されたメソッド
- URL:プロファイリングされたURL
- 時間:このプロファイリングデータが収集された時間
- wt(ウォールタイム):このリクエストが完了するまでにかかった時間
- cpu:CPUがこの要求を実行するために費やした時間
- mu(メモリ使用量):このリクエスト中に使用された平均メモリ
- pmu(ピークメモリ使用量):このリクエスト中のメモリ使用量のピーク
プロファイリング実行の詳細を表示するには、timeフィールドのリンクを使用してください。 次のようなページが表示されます。
左側には、使用されたメソッド、スクリプト名とURL、リクエストパラメータなど、分析されたリクエストに関する情報が表示されます。 メインページのコンテンツでは、実行に最も時間がかかった関数またはメソッド、およびメモリ消費量が多かった関数またはメソッドを特定できます。 この情報はすべて、特定のプロファイリングの実行と要求に関連しています。
###関数呼び出しの検査
ページの一番下までスクロールすると、関数またはメソッドが実行された回数、実行にかかった時間、量など、このリクエスト中に実行されたすべての関数呼び出しに関する詳細情報を含むテーブルにアクセスできます。それが使用したメモリ、および他の多くの興味深い詳細。 テーブルヘッダーを使用して、これらのパラメーターのいずれかでリストを並べ替えることができます。 右側の検索ボックスを使用して、特定の関数またはメソッド名を検索することもできます。
###実行の比較XHGuiの最も便利な機能の1つは、2つの異なるプロファイリング実行を比較するために使用できる比較ツールです。 これにより、コードに変更を加え、複数の実行を比較して、変更によってアプリケーションのパフォーマンスが向上したかどうかを確認できます。
プロファイルデータのセットを見ると、ウォッチ機能セクションの右側に、この実行の比較という名前のボタンが表示されます。 このボタンをクリックすると、その特定のURLに対して実行されたすべてのプロファイリング実行のリストが表示されます。ここで、リスト内の項目の1つを選択して、比較ビューを生成できます。 比較する実行を選択し、比較ボタンをクリックするだけです。
比較ビューは次のようになります。
##結論
プロファイリングはソフトウェア最適化の重要な手法であり、コードレベルでアプリケーションに関する詳細な洞察を提供します。 XHProfやXHGuiなどのツールを使用すると、コードの問題のある部分を効果的に特定し、アプリケーションのパフォーマンスにおけるコード変更の影響を監視できます。
XHGuiで使用可能な構成オプションの詳細については、公式のGithubリポジトリを確認してください。