###序章

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

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

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がインストールされていない場合は、今すぐインストールする必要があります。 xhprofmongoPHP拡張機能の両方をセットアップするために必要になります。

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

  1. sudo apt-get update

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

  1. sudo apt-get install php-pear php5-dev php5-mcrypt

mcrypt拡張機能を有効にするには、次のコマンドを実行します。

  1. sudo php5enmod mcrypt

最後に、XHGuiをインストールするにはGitが必要です。 Gitがサーバーにまだインストールされていない場合は、次のコマンドで今すぐインストールできます。

  1. sudo apt-get install git

##ステップ2— XHProfをインストールするこれで、XHProfをインストールして有効にする必要があります。 peclを介してインストールするには、次のコマンドを実行します。

  1. sudo pecl install xhprof-beta

次に、xhprof拡張機能をアクティブ化する必要があります。 Ubuntu / Debian標準を維持しながらこのプロセスを容易にするために、別のini構成ファイルを作成し、コマンドphp5enmodを使用して有効にします。

/etc/php5/mods-available内に新しいini構成ファイルを作成します。

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

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

/etc/php5/mods-available/xhprof.ini
extension=xhprof.so

モジュール構成ファイルを有効にするには、次のコマンドを実行します。

  1. sudo php5enmod xhprof

あとは、変更を適用するためにWebサーバーを再起動するだけです。 LAMP 環境(Apache)では、次の方法でこれを行うことができます。

  1. sudo service apache2 restart

LEMP 環境(Nginx + PHP5-FPM)では、php5-fpmサービスを次のコマンドで再起動する必要があります。

  1. sudo service php5-fpm restart

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

  1. php --ri xhprof

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

Output
xhprof xhprof => 0.9.2 CPU num => 1

##ステップ3— MongoDBをインストールする次のステップは、MongoDBとmongoPHP拡張機能をサーバーにインストールすることです。 MongoDBは、XHGuiによって使用され、XHProfのアプリケーション分析によって取得されたデータを保存します。

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

  1. sudo apt-get install mongodb

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

  1. sudo pecl install mongo

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

次に、xhprof拡張機能で使用したのと同じ手順に従って、mongoPHP拡張機能をアクティブ化する必要があります。 /etc/php5/mods-available/mongo.iniに新しい構成ファイルを作成します。

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

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

/etc/php5/mods-available/mongo.ini
extension=mongo.so

モジュール構成ファイルを有効にするには、次のコマンドを実行します。

  1. sudo php5enmod mongo

次に、Webサーバーを再起動して、変更を適用します。 LAMP 環境(Apache)では、次の方法でこれを行うことができます。

  1. sudo service apache2 restart

LEMP 環境(Nginx + PHP5-FPM)では、php5-fpmサービスを次のコマンドで再起動する必要があります。

  1. sudo service php5-fpm restart

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

  1. php --ri mongo

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

Output
mongo 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クライアントにアクセスします。

  1. mongo

ここで、XHGuiのインデックスを作成するために、次の一連のコマンドを実行します。

  1. use xhprof
  2. db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
  3. db.results.ensureIndex( { 'profile.main().wt' : -1 } )
  4. db.results.ensureIndex( { 'profile.main().mu' : -1 } )
  5. db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
  6. db.results.ensureIndex( { 'meta.url' : 1 } )

MongoDBクライアントを終了するには、次のコマンドを実行します。

  1. exit

##ステップ5— XHGuiをインストールする次のステップは、XHGuiをインストールし、Webサーバー上の仮想ホストとしてセットアップすることです。

まず、GithubからXHGuiリポジトリのクローンを作成します。 XHGuiのコンテンツをWebサーバー上の仮想ホストとして提供する必要があるため、複製されたリポジトリを/var/www内に配置します。

XHGuiディレクトリを通常のユーザーが所有するように設定することをお勧めします。 この例では、ユーザー名とグループとしてsammyを使用しますが、これらの値を独自のユーザー名とグループに置き換える必要があります。

  1. sudo mkdir -p /var/www/xhgui
  2. sudo chown -R sammy.sammy /var/www/xhgui
  3. cd /var/www
  4. git clone https://github.com/perftools/xhgui.git xhgui

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

  1. cd xhgui
  2. php install.php

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

###LAMPでのXHGuiの仮想ホストの設定

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

  1. sudo a2enmod rewrite

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

  1. 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仮想ホストを設定する方法ガイドを確認してください。

次のコマンドで仮想ホストを有効にします。

  1. sudo a2ensite xhgui

変更を適用するには、次のコマンドでApacheをリロードします。

  1. sudo service apache2 reload

###LEMPでのXHGuiの仮想ホストの設定

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

  1. 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サーバーブロックを設定する方法を確認してください。

新しい仮想ホストを有効にするには、次のコマンドを実行します。

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

ここで、Nginxを再起動して変更を適用します。

  1. sudo service nginx restart

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

Image 01: XHGui First Run

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サイトのプロファイリングを有効にします。 選択したコマンドラインエディタでこのファイルを開きます。

  1. 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を再起動して、変更を適用します。

  1. sudo service apache2 restart

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

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

  1. 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を再起動して、変更を適用します。

  1. sudo service nginx restart

##ステップ7—XHGui入門

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

###XHGuiの概要

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

Image 02: XHGui Overview

以下に、この概要表の各フィールドの簡単な説明を示します。

  • メソッド:分析されたリクエストで使用されたメソッド
  • URL:プロファイリングされたURL
  • 時間:このプロファイリングデータが収集された時間
  • wt(実時間):このリクエストが完了するまでにかかった時間
  • cpu:CPUがこの要求を実行するために費やした時間
  • mu(メモリ使用量):このリクエスト中に使用された平均メモリ
  • pmu(ピークメモリ使用量):このリクエスト中のメモリ使用量のピーク

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

Image 03: Profiling Data

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

###関数呼び出しの検査

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

Image 04: XHGui Function Calls

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

プロファイルデータのセットを見ると、ウォッチ機能セクションの右側に、この実行の比較という名前のボタンが表示されます。 このボタンをクリックすると、その特定のURLに対して実行されたすべてのプロファイリング実行のリストが表示されます。ここで、リスト内の項目の1つを選択して、比較ビューを生成できます。 比較する実行を選択し、比較ボタンをクリックするだけです。

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

Image 05: XHGui Comparing Runs

##結論

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

XHGuiで使用可能な構成オプションの詳細については、公式のGithubリポジトリを確認してください。