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
パッケージとともにインストールします。 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
を介してインストールするには、次のコマンドを実行します。
- ステップ2— XHProfをインストールするこれで、XHProfをインストールして有効にする必要があります。
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と
mongo
PHP拡張機能をサーバーにインストールすることです。 MongoDBは、XHGuiによって使用され、XHProfのアプリケーション分析によって取得されたデータを保存します。
- ステップ3— MongoDBをインストールする次のステップは、MongoDBと
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
これで、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
のコンテンツを提供するように仮想ホストを構成する必要があります。 次のセクションでは、LAMP環境とLEMP環境の両方でxhgui
の仮想ホストを作成する方法について説明します。
- 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>
ドキュメントルートは、XHGuiのメインディレクトリ内のサブディレクトリwebroot
を指している必要があることに注意してください。
現在、この仮想ホストに使用できるサブドメインがない場合は、ダミーのドメイン名を使用して、ローカルの/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
このファイル内に次の内容を配置します。
/ 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; } }
ドキュメントルートは、XHGuiのメインディレクトリ内のサブディレクトリwebroot
を指している必要があることに注意してください。
現在、この仮想ホストに使用できるサブドメインがない場合は、ダミーのドメイン名を使用して、ローカルの/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構成ファイルを編集してみましょう。 この例では、/etc/apache2/sites-available/000-default.conf
で定義されているこのサーバーでホストされているメインのApacheWebサイトのプロファイリングを有効にします。 選択したコマンドラインエディタでこのファイルを開きます。
sudo nano /etc/apache2/sites-available/000-default.conf
強調表示された行を既存の<VirtualHost>
ブロック内に含めます。
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> ... php_admin_value auto_prepend_file "/var/www/xhgui/external/header.php" ... </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$ { ... 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リポジトリを確認してください。