Профилирование PHP-приложений с помощью XHProf и XHGui в Ubuntu 14.04

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

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

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

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

Данное руководство поможет установить XHProf и XHGui и использовать их для профилирования приложений PHP в Ubuntu 14.04.

Примечание: На данный момент XHProf не поддерживает PHP 7. Если на вашем сервере установлена эта версия PHP, используйте tideways/php-profiler-extension вместо XHProf.

Требования

1: Установка зависимостей

Если на вашем сервере нет расширения pecl, установите его сейчас. Также нужно установить PHP-расширения xhprof и mongo.

Сначала обновите индекс пакетов:

sudo apt-get update

Теперь можно установить расширение pecl, которое входит в пакет php-pear. Также нужно установить пакет php5-dev, с помощью которого pecl сможет устанавливать модули PHP, и php5-mcrypt, который пригодится для установки XHGui.

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

Включите расширение mcrypt:

sudo php5enmod mcrypt

Также для установки 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

Добавьте в него строку:

extension=xhprof.so

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

sudo php5enmod xhprof

Теперь нужно перезапустить веб-сервер, чтобы изменения вступили в силу. В стеке LAMP (Apache) это делается с помощью команды:

sudo service apache2 restart

В окружении LEMP (Nginx + PHP5-FPM) перезапустить веб-сервер можно с помощью команды:

sudo service php5-fpm restart

Теперь расширение xhprof установлено и включено. Чтобы убедиться, что всё прошло успешно, введите:

php --ri xhprof

Команда должна вернуть:

xhprof
xhprof => 0.9.2
CPU num => 1

3: Установка MongoDB

Теперь нужно установить MongoDB и PHP-расширение mongo. XHGui использует MongoDB для хранения данных, собранных XHProf.

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

sudo apt-get install mongodb

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

sudo pecl install mongo

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

Теперь нужно включить расширение mongo. Это делается точно так же, как и в случае с xhprof. Создайте новый конфигурационный файл в /etc/php5/mods-available/mongo.ini.

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

Добавьте в него такой код:

extension=mongo.so

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

sudo php5enmod mongo

Перезапустите веб-сервер, чтобы обновить настройки.

LAMP
sudo service apache2 restart
LEMP
sudo service php5-fpm restart

Теперь расширение mongo установлено и включено. Чтобы убедиться в этом, введите:

php --ri mongo

Команда вернёт такой вывод:

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 (опционально)

Этот этап опционален, но его рекомендуется выполнить, поскольку он позволяет повысить общую производительность 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 вашему обычному пользователю. В данном примере такой пользователь называется 8host. Укажите имя своего пользователя и группы.

sudo mkdir -p /var/www/xhgui
sudo chown -R 8host.8host /var/www/xhgui
cd /var/www
git clone https://github.com/perftools/xhgui.git xhgui

Чтобы установить зависимости XHGui, запустите встроенный инсталлятор:

cd xhgui
php install.php

После этого нужно создать виртуальный хост для xhgui.

Создание виртуального хоста для xhgui на Apache

Сначала нужно убедиться, что Apache поддерживает mod_rewrite. Чтобы включить этот модуль, введите:

sudo a2enmod rewrite

Создайте новый виртуальный хост в /etc/apache2/sites-available:

sudo nano /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>

Обратите внимание: директива document root должна указывать на подкаталог webroot в главном каталоге XHGui.

Примечание: Если на данный момент у вас нет поддомена, который вы могли бы использовать для этого виртуального хоста, вы можете использовать фиктивный домен и создать запись в локальном файле /etc/hosts, которая направит ServerName (домен) на IP-адрес сервера. Подробнее об этом – в статье Настройка виртуальных хостов Apache в Ubuntu 14.04 LTS.

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

sudo a2ensite xhgui

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

sudo service apache2 reload

Создание виртуального хоста для xhgui на Nginx

Создайте файл для нового виртуального хоста в /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;
}
}

Обратите внимание: директива document root должна указывать на подкаталог webroot в главном каталоге XHGui.

Примечание: Если на данный момент у вас нет поддомена, который вы могли бы использовать для этого виртуального хоста, вы можете использовать фиктивный домен и создать запись в локальном файле /etc/hosts, которая направит ServerName (домен) на IP-адрес сервера. Подробнее об этом – в этой статье.

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

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

Перезапустите Nginx:

sudo service nginx restart

6: Настройка XHProf

Теперь вы можете получить доступ к интерфейсу XHGui в веб-браузере. Для этого введите домен, который вы указали в директиве server name. Поскольку на данный момент никаких характеристик не собрано, на экране появится страница:

Recent runs
Looks like you haven’t done any profiling
[…]

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

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

Далее показано, как автоматически добавить хедер в сценарии на Apache и Nginx.

Примечание: Для примера в руководстве показано, как включить профилирование для WordPress.

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

Отредактируйте конфигурационный файл Apache. Для примера включим профилирование для главного сайта Apache, размещённого на этом сервере (файл /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

Отредактируйте конфигурационный файл Nginx. Для примера включим профилирование для сайта default, размещённого на этом сервере (файл /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

Теперь установка полностью готова к работе.

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

Краткий обзор XHGui

Когда данные будут доступны, на экране вы увидите заголовок Recent runs и несколько столбцов:

  • Method: метод, с помощью которого был проанализирован запрос.
  • URL: проанализированный URL-адрес.
  • Time: время сбора данных профилирования.
  • wt (Wall Time): время, которое потребовалось на обработку запроса.
  • cpu: время, затраченное процессором на выполнение этого запроса.
  • mu (Memory Usage): средний объем использования памяти во время этого запроса.
  • pmu (Peak Memory Usage): пик использования памяти во время обработки этого запроса.

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

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

Вызов функций

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

Сравнение в XHGui

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

Справа от раздела Watch Functions вы можете найти кнопку Compare This Run. Нажав на неё, вы увидите список всех операций профилирования, когда-либо запущенных для этого URL-адреса. Выберите профилирование, с которым вы хотите сравнить полученные данные и нажмите Compare.

Заключение

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

За подробной информацией о XHGui можно обратиться к репозиторию Github.

Tags: , , , , , ,

Добавить комментарий