Как настроить XHProf и XHGui для профилирования PHP-приложений в Ubuntu 14.04

Вступление

В программной инженерии профилирование - это метод, используемый для анализа приложений во время выполнения с целью выявления возможных узких мест и проблем с производительностью в приложении. Это важный ресурс для оптимизации программного обеспечения. Профилирование отличается от бенчмаркинга, поскольку он анализирует приложение на уровне кода, а бенчмаркинг предназначен для анализа общей производительности приложения с точки зрения конечного пользователя.

  • Profiler * - это программное обеспечение, которое будет собирать подробную информацию о приложении, чтобы, помимо прочего, генерировать статистику и полезные данные об использовании памяти, частоте и продолжительности вызовов функций, времени для ответа на запрос.

XHProf - это профилировщик, разработанный для анализа PHP-приложений. Созданный и открытый с помощью Facebook, XHProf работает как пассивный профилировщик, что означает, что он будет работать в фоновом режиме, минимально влияя на производительность приложения, что делает его пригодным для использования в производственных средах.

XHGui предлагает богатый интерфейс для визуализации данных, собранных через XHProf.

Из этого туториала Вы узнаете, как установить XHProf и XHGui для профилирования приложения PHP, работающего в Ubuntu 14.04.

Предпосылки

Чтобы следовать этому руководству, вам потребуется:

  • Сервер Ubuntu 14.04 с некорневым пользователем sudo, который вы можете настроить, следуя нашему Initial Server Настройка руководство

  • Функциональная среда веб-сервера PHP, на которой выполняется приложение PHP, которое будет проанализировано

Когда вы будете готовы двигаться дальше, войдите на свой сервер, используя свою учетную запись sudo.

Шаг 1 - Установите зависимости сервера

Если на вашем сервере не установлено + pecl +, вы должны установить его сейчас. Нам понадобится установить и PHP-расширение + xhprof + и + mongo +.

Сначала обновите кеш менеджера пакетов:

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

Наконец, нам понадобится Git для установки XHGui. Если 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

Включите в этот файл следующее содержимое:

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

extension=xhprof.so

Чтобы включить файл конфигурации модуля, запустите:

sudo php5enmod xhprof

Теперь осталось только перезапустить веб-сервер, чтобы применить изменения. В средах * 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 + на сервере. MongoDB используется XHGui для хранения данных, полученных с помощью анализа приложений XHProf.

Чтобы установить MongoDB, запустите:

sudo apt-get install mongodb

Чтобы установить PHP-расширение MongoDB, выполните:

sudo pecl install mongo

В какой-то момент программа установки запросит ваш ввод, чтобы выбрать, хотите ли вы включить корпоративную аутентификацию для MongoDB. Вы можете оставить значение по умолчанию (нет) и просто нажать Enter, чтобы продолжить установку.

Теперь нам нужно активировать PHP-расширение + mongo +, следуя той же процедуре, которую мы использовали для расширения + xhprof +. Создайте новый файл конфигурации в + / 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

Теперь перезапустите веб-сервер, чтобы применить изменения. В средах * 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 (необязательно)

Это необязательный, но рекомендуемый шаг, который улучшит общую производительность XHGui при хранении и доступе к данным из MongoDB.

Доступ к клиенту 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 и настройка его в качестве виртуального хоста на вашем веб-сервере.

Мы начнем с клонирования репозитория XHGui от Github. Поскольку нам нужно обслуживать содержимое XHGui в качестве виртуального хоста на веб-сервере, мы поместим клонированный репозиторий в + / 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 +. В следующих разделах рассказывается, как создать виртуальный хост для + xhgui + в средах LAMP и LEMP.

Настройка виртуального хоста XHGui на LAMP

При использовании Apache в качестве веб-сервера, мы должны сначала убедиться, что + 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>

Обратите внимание, что корень документа должен указывать на подкаталог + webroot + внутри основного каталога XHGui.

Включить виртуальный хост с помощью:

sudo a2ensite xhgui

Чтобы применить изменения, перезагрузите Apache с помощью:

sudo service apache2 reload

Настройка виртуального хоста XHGui на LEMP

Начните с создания нового файла виртуального хоста в + / etc / nginx / sites-available:

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

Поместите следующее содержимое в этот файл:

/ И т.д. / Nginx / сайты Недоступные / 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;
   }
}

Обратите внимание, что корень документа должен указывать на подкаталог + webroot + внутри основного каталога XHGui.

Чтобы включить новый виртуальный хост, запустите:

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

Теперь перезапустите Nginx, чтобы применить изменения:

sudo service nginx restart

Шаг 6 - Настройте XHProf

На этом этапе вы сможете получить доступ к интерфейсу XHGui из вашего браузера, посетив имя сервера, которое вы указали в конфигурации вашего веб-сервера. Поскольку мы еще не начали собирать данные профилирования, вы должны увидеть страницу, подобную этой:

изображение: http: //assets.digitalocean.com/articles/xhprof-ubuntu/01-empty.png [Изображение 01: Первый запуск XHGui]

Расширение XHProf уже установлено на сервере, но нам все еще нужно активировать процесс профилирования для вашего приложения. Обычно это делается путем включения на ваш веб-сервер директивы PHP, которая автоматически добавляет фрагмент кода ко всем выполняемым сценариям PHP. Важно отметить, что по умолчанию XHProf будет профилировать только 1 из 100 запросов к приложению.

XHGui предоставляет PHP-заголовок по умолчанию, который вы можете добавить в свои сценарии, чтобы инициализировать профилирование для вашего приложения. Если вы выполнили все шаги в этом руководстве, файл заголовка должен быть расположен по адресу + / var / www / xhgui / external / header.php +.

В следующих разделах будет показано, как автоматически добавлять этот заголовочный файл ко всем вашим PHP-сценариям в средах Apache и Nginx. В этом примере мы включим профилирование для приложения WordPress, которое размещается в качестве основного веб-сайта на этом сервере.

Включение профилирования на Apache

Давайте отредактируем файл конфигурации Apache для веб-сайта, который мы хотим профилировать. В этом примере мы включим профилирование для основного веб-сайта Apache, размещенного на этом сервере, определенного в + / etc / apache2 / sites-available / 000-default.conf +. Откройте этот файл с помощью выбранного редактора командной строки:

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

Давайте отредактируем файл конфигурации Nginx для веб-сайта, который мы хотим профилировать. В этом примере мы включим профилирование для веб-сайта + default +, размещенного на этом сервере, определенного в + / etc / nginx / sites-available / default +. Откройте этот файл с помощью выбранного редактора командной строки:

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

Теперь найдите блок, который определяет, как обрабатываются скрипты + .php +. Включить выделенную строку внутри этого блока:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

location ~ \.php$ {
  ...

  ...
}

Сохраните файл и выйдите. Перезапустите Nginx, чтобы применить изменения:

sudo service nginx restart

Шаг 7 - Начало работы с XHGui

Теперь все настроено правильно, но в зависимости от количества просмотров, которые обычно получает ваш сайт, может пройти некоторое время, прежде чем первые данные профилирования появятся в XHGui. Это связано с тем, что по умолчанию XHProf будет профилировать только 1 из 100 полученных запросов. Возможно, вам придется перейти на ваш сайт и перезагрузить его несколько раз, прежде чем какие-либо данные профиля будут доступны.

Обзор XHGui

Когда информация о профилировании доступна, вы должны увидеть страницу, подобную этой:

изображение: http: //assets.digitalocean.com/articles/xhprof-ubuntu/02-overview.png [Изображение 02: Обзор XHGui]

Ниже вы можете найти краткое описание каждого поля в этой обзорной таблице:

  • * Метод: * Метод, используемый в анализируемом запросе

  • * URL: * URL, который был профилирован

  • * Время: * Время, когда были собраны эти данные профилирования

  • * wt (Wall Time): * Сколько времени потребовалось для выполнения этого запроса

  • * cpu: * Время, затраченное процессором на выполнение этого запроса

  • * mu (использование памяти): * средний объем памяти, использованный во время этого запроса

  • * pmu (Peak Memory Usage): * Пик использования памяти во время этого запроса

Чтобы просмотреть подробности прогона профилирования, используйте ссылку в поле time. Вы должны увидеть такую ​​страницу:

изображение: http: //assets.digitalocean.com/articles/xhprof-ubuntu/03-profile.png [Изображение 03: данные профилирования]

С левой стороны вы можете увидеть информацию о запросе, который был проанализирован, например, используемый метод, имя скрипта и URL, параметры запроса, среди прочего. На содержании главной страницы вы можете определить функции или методы, которые занимали больше всего времени, а также функции или методы, которые потребляли больше памяти. Вся эта информация относится к конкретному прогону профилирования и запросу.

Проверка вызовов функций

Если вы прокрутите вниз до нижней части страницы, у вас будет доступ к таблице с подробной информацией обо всех вызовах функций, выполненных во время этого запроса, в том числе сколько раз была выполнена функция или метод, сколько времени потребовалось для ее запуска, сколько память, которую он использовал, и много других интересных деталей. Вы можете использовать заголовок таблицы, чтобы упорядочить список по любому из этих параметров. Вы также можете использовать поле поиска справа для поиска определенной функции или имени метода.

изображение: http: //assets.digitalocean.com/articles/xhprof-ubuntu/04-functioncalls.png [Изображение 04: вызовы функций XHGui]

Сравнение прогонов

Одной из наиболее полезных функций XHGui является инструмент сравнения, который можно использовать для сравнения двух разных прогонов профилирования. Это дает вам возможность вносить изменения в ваш код и сравнивать несколько запусков, чтобы увидеть, не привели ли ваши изменения к повышению производительности приложения.

Просматривая набор данных профиля, справа от раздела Watch Functions вы можете увидеть кнопку с именем * Compare This Run *. Нажатие на эту кнопку покажет вам список всех прогонов профилирования, выполненных для этого конкретного URL, где вы можете выбрать один из элементов в списке, чтобы создать представление сравнения. Просто выберите, с каким прогоном вы хотите сравнить, и нажмите кнопку Compare.

Вот так выглядит представление сравнения:

изображение: http: //assets.digitalocean.com/articles/xhprof-ubuntu/05-compare.png [Изображение 05: XHGui Comparing Runs]

Заключение

Профилирование - это важная техника для оптимизации программного обеспечения, которая дает вам подробное представление о вашем приложении на уровне кода. С помощью таких инструментов, как XHProf и XHGui, вы можете эффективно выявлять проблемные части кода и отслеживать влияние изменений кода на производительность приложения.

Для получения дополнительной информации о параметрах конфигурации, доступных для XHGui, посетите официальный Github репозиторий.

Related