前書き

ソフトウェアエンジニアリングでは、プロファイリングは、アプリケーション内で発生する可能性のあるボトルネックとパフォーマンスの問題を識別するために、実行時にアプリケーションを分析するために使用される手法です。 ソフトウェアの最適化に不可欠なリソースです。 プロファイリングは、コードレベルでアプリケーションを分析するため、ベンチマークとは異なります。ベンチマークは、エンドユーザーが経験するアプリケーション全体のパフォーマンスを分析することを目的としています。

*プロファイラー*は、メモリ使用量、関数呼び出しの頻度と期間、リクエストへの応答時間などに関する統計と洞察に富んだデータを生成するために、アプリケーションに関する詳細情報を収集するソフトウェアです。

XHProfは、PHPアプリケーションを分析するために設計されたプロファイラーです。 XHProfはFacebookによって作成およびオープンソース化され、パッシブプロファイラーとして機能します。つまり、バックグラウンドで動作し、アプリケーションのパフォーマンスへの影響を最小限に抑え、本番環境での使用に適しています。

XHGuiは、XHProfを介して収集されたデータを視覚化するための豊富なインターフェイスを提供します。

このチュートリアルでは、Ubuntu 14.04で実行されているPHPアプリケーションをプロファイリングするためにXHProfとXHGuiをインストールする方法を示します。

前提条件

このガイドに従うには、次のものが必要です。

  • 非ルートsudoユーザーを持つUbuntu 14.04サーバー。https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [初期サーバーセットアップ]ガイド

  • 分析されるPHPアプリケーションを実行する機能的なPHP Webサーバー環境

次に進む準備ができたら、sudoアカウントを使用してサーバーにログインします。

手順1-サーバーの依存関係のインストール

サーバーに「+ pecl 」がインストールされていない場合は、すぐにインストールする必要があります。 ` xhprof `と ` mongo +` PHP拡張モジュールの両方をセットアップするために必要になります。

まず、パッケージマネージャーのキャッシュを次のように更新します。

sudo apt-get update

次に、 `+ php-pear `パッケージとともに ` pecl `をインストールします。 また、 ` pecl `を介してPHPモジュールをインストールするために ` php5-dev `と、XHGuiをセットアップするために ` php5-mcrypt +`が必要です。

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 +`を使用して有効にします。

`+ / etc / php5 / mods-available `内に新しい ` ini +`設定ファイルを作成します:

sudo nano /etc/php5/mods-available/xhprof.ini

このファイルに次の内容を含めます。

/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

これで、 `+ xhprof +`拡張機能がインストールされ、アクティブ化されるはずです。 確認するには、次を実行します。

php --ri xhprof

出力は次のようになります。

Outputxhprof

xhprof => 0.9.2
CPU num => 1

ステップ3-MongoDBのインストール

次のステップは、MongoDBとサーバーにインストールされているPHP拡張モジュール `+ mongo +`を取得することです。 XHGuiは、MongoDBを使用して、XHProfのアプリケーション分析から取得したデータを保存します。

MongoDBをインストールするには、次を実行します。

sudo apt-get install mongodb

MongoDB PHP拡張機能をインストールするには、次を実行します。

sudo pecl install mongo

インストールは、MongoDBのエンタープライズ認証を有効にするかどうかを選択するために、ある時点で入力を求めます。 デフォルト値(no)のままにして、Enterキーを押すだけでインストールを続行できます。

次に、 + xhprof +`拡張に使用したのと同じ手順に従って、 `+ mongo + PHP拡張を有効にする必要があります。 `+ / etc / php5 / mods-available / mongo.ini +`に新しい設定ファイルを作成します:

sudo nano /etc/php5/mods-available/mongo.ini

ファイルに次の内容を含めます。

/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

`モンゴ`拡張機能がインストールされ、有効にする必要があります。 確認するには、次を実行します。

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 . /var/www/xhgui
cd /var/www
git clone https://github.com/perftools/xhgui.git xhgui

XHGuiの依存関係をインストールするには、付属のインストーラーを実行します。

cd xhgui
php install.php

依存関係が正常にインストールされたら、 `+ xhgui `のコンテンツを提供する仮想ホストを設定する必要があります。 次のセクションでは、LAMP環境とLEMP環境の両方で ` xhgui +`の仮想ホストを作成する方法について説明します。

LAMPでのXHGuiの仮想ホストのセットアップ

ApacheをWebサーバーとして使用する場合、最初に `+ mod_rewrite +`が有効になっていることを確認する必要があります。 有効にするには、次を実行します:

sudo a2enmod rewrite

`+ / etc / apache2 / sites-available`の下に新しい仮想ホストファイルを作成します。

sudo nano /etc/apache2/sites-available/xhgui.conf

このファイル内に次の内容を配置します。

/etc/apache2/sites-available/xhgui.conf

<VirtualHost *:80>
   DocumentRoot /var/www/xhgui/webroot
   ServerName

   <Directory "/var/www/xhgui/webroot">
       Options Indexes MultiViews FollowSymLinks
       AllowOverride All
       Require all granted
   </Directory>
</VirtualHost>

ドキュメントルートは、XHGuiのメインディレクトリ内のサブディレクトリ `+ webroot +`を指す必要があることに注意してください。

仮想ホストを有効にします:

sudo a2ensite xhgui

変更を適用するには、次を使用してApacheをリロードします。

sudo service apache2 reload

LEMPでのXHGuiの仮想ホストのセットアップ

`+ / etc / nginx / sites-available +`に新しい仮想ホストファイルを作成することから始めます。

sudo nano /etc/nginx/sites-available/xhgui

このファイル内に次の内容を配置します。

/ etc / nginx / sites-available / xhgui

server {
   listen   80;
   server_name ;
   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;
   }
}

ドキュメントルートは、XHGuiのメインディレクトリ内のサブディレクトリ `+ webroot +`を指す必要があることに注意してください。

新しい仮想ホストを有効にするには、次を実行します:

sudo ln -s /etc/nginx/sites-available/xhgui /etc/nginx/sites-enabled/xhgui

次に、Nginxを再起動して変更を適用します。

sudo service nginx restart

ステップ6-XHProfのセットアップ

この時点で、Webサーバー構成で指定したサーバー名にアクセスすることにより、ブラウザーからXHGuiのインターフェイスにアクセスできるはずです。 プロファイリングデータの収集をまだ開始していないため、次のようなページが表示されます。

image:http://assets.digitalocean.com/articles/xhprof-ubuntu/01-empty.png [画像01:XHGuiの初回実行]

XHProf拡張機能は既にサーバーにインストールされていますが、アプリケーションのプロファイリングプロセスをアクティブにする必要があります。 これは通常、実行中のすべてのPHPスクリプトにコードの一部を自動的に追加するPHPディレクティブをWebサーバーに含めることによって行われます。 デフォルトでは、XHProfはアプリケーションに対して行われた100件のリクエストのうち1件のみをプロファイルすることに注意することが重要です。

XHGuiは、アプリケーションのプロファイリングを初期化するためにスクリプトに追加できるデフォルトのPHPヘッダーを提供します。 このチュートリアルのすべての手順を実行した場合、ヘッダーファイルは `+ / var / www / xhgui / external / header.php +`にあるはずです。

次のセクションでは、Apache環境とNginx環境の両方で、このヘッダーファイルをすべてのPHPスクリプトに自動的に付加する方法を示します。 この例では、このサーバーのメインWebサイトとしてホストされているWordPressアプリケーションのプロファイリングを有効にします。

Apacheでプロファイリングを有効にする

プロファイリングするWebサイトのApache構成ファイルを編集しましょう。 この例では、 `+ / etc / apache2 / sites-available / 000-default.conf +`で定義されている、このサーバーでホストされているメインのApache Webサイトのプロファイリングを有効にします。 選択したコマンドラインエディターでこのファイルを開きます。

sudo nano /etc/apache2/sites-available/000-default.conf

既存の `+ <VirtualHost> +`ブロック内に強調表示された行を含めます。

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
 ...

 ...
</VirtualHost>

ファイルを保存して終了します。 Apacheを再起動して、変更を適用します。

sudo service apache2 restart

Nginxでプロファイリングを有効にする

プロファイリングするWebサイトのNginx構成ファイルを編集しましょう。 この例では、 + / etc / nginx / sites-available / default +`で定義されている、このサーバーでホストされている `+ default + Webサイトのプロファイリングを有効にします。 選択したコマンドラインエディターでこのファイルを開きます。

sudo nano /etc/nginx/sites-available/default

ここで、 `+ .php +`スクリプトの処理方法を定義するブロックを探します。 このブロック内に強調表示された行を含めます。

/ etc / nginx / sites-available / default

location ~ \.php$ {
  ...

  ...
}

ファイルを保存して終了します。 Nginxを再起動して、変更を適用します。

sudo service nginx restart

ステップ7-XHGuiの使用開始

すべてが正しく設定されましたが、Webサイトが通常取得するビューの量によっては、XHGuiに最初のプロファイリングデータが表示されるまでに時間がかかる場合があります。 これは、デフォルトでXHProfが受信した100リクエストのうち1リクエストのみをプロファイルするという事実によるものです。 プロファイルデータが利用可能になる前に、Webサイトをナビゲートし、数回リロードする必要がある場合があります。

XHGuiの概要

プロファイリング情報が利用可能になると、次のようなページが表示されます。

image:http://assets.digitalocean.com/articles/xhprof-ubuntu/02-overview.png [画像02:XHGuiの概要]

以下に、この概要表の各フィールドの簡単な説明があります。

  • * Method:*分析されたリクエストで使用されるメソッド

  • * URL:*プロファイルされたURL

  • *時間:*このプロファイリングデータが収集された時間

  • * wt(Wall Time):*このリクエストが完了するまでにかかった時間

  • * cpu:*この要求を実行するためにCPUが費やした時間

  • * mu(メモリ使用量):*このリクエスト中に使用された平均メモリ

  • * pmu(ピークメモリ使用量):*このリクエスト中のメモリ使用量のピーク

プロファイリング実行の詳細を表示するには、_time_フィールドのリンクを使用します。 次のようなページが表示されるはずです。

image:http://assets.digitalocean.com/articles/xhprof-ubuntu/03-profile.png [画像03:データのプロファイリング]

左側には、使用されたメソッド、スクリプト名とURL、リクエストパラメータなど、分析されたリクエストに関する情報が表示されます。 メインページのコンテンツでは、実行に最も時間がかかった関数またはメソッド、およびメモリ消費量が多い関数またはメソッドを特定できます。 これらの情報はすべて、特定のプロファイリングの実行とリクエストに関連しています。

関数呼び出しの検査

ページの一番下までスクロールすると、このリクエスト中に実行されたすべての関数呼び出しに関する詳細情報を含むテーブルにアクセスできます。これには、関数またはメソッドが実行された回数、実行にかかった時間、それが使用したメモリ、および他の多くの興味深い詳細。 テーブルヘッダーを使用して、これらのパラメーターのいずれかでリストを順序付けることができます。 右側の検索ボックスを使用して、特定の関数またはメソッド名を検索することもできます。

image:http://assets.digitalocean.com/articles/xhprof-ubuntu/04-functioncalls.png [画像04:XHGui関数呼び出し]

実行の比較

XHGuiの最も便利な機能の1つは、2つの異なるプロファイリング実行を比較するために使用できる比較ツールです。 これにより、コードを変更し、複数の実行を比較して、変更によってアプリケーションのパフォーマンスが向上したかどうかを確認できます。

_Watch Functions_セクションの右側にあるプロファイルデータのセットを見ると、* Compare This Run *という名前のボタンがあります。 このボタンをクリックすると、その特定のURLに対して実行されたすべてのプロファイリング実行のリストが表示され、リスト内のアイテムの1つを選択して比較ビューを生成できます。 比較する実行を選択し、[比較]ボタンをクリックします。

これにより、比較ビューは次のようになります。

image:http://assets.digitalocean.com/articles/xhprof-ubuntu/05-compare.png [画像05:XHGuiのランの比較]

結論

プロファイリングはソフトウェア最適化のための重要な手法であり、コードレベルでアプリケーションに関する詳細な洞察を提供します。 XHProfやXHGuiなどのツールを使用すると、コードの問題のある部分を効果的に特定し、アプリケーションのパフォーマンスにおけるコード変更の影響を監視できます。

XHGuiで使用可能な構成オプションの詳細については、公式のhttps://github.com/perftools/xhgui[Githubリポジトリ]を確認してください。