Профилирование PHP – кода. XHprof – иерархический профайлер c html-интерфейсом

Tweet

Что такое профилирование?

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

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

Профилирование PHP –кода

Наиболее известными PHP-профайлерами являются:

Xdebug's Profiler (http://www.xdebug.org/docs/profiler) и XHprof (http://pecl.php.net/package/xhprof). О втором и пойдет речь.

O XHprof

XHprof – это иерархический профайлер для PHP c HTML интерфейсом. Ядро написано на языке С (на уровне отчетов и интерфейса код уже весь на PHP), а для скачки доступно в виде екстеншина для PHP. Этот профайлер умеет собирать данные об использовании памяти, ресурсов процессора, количестве и последовательности вызовов функций, а также inclusive time (время, потраченное на функцию и на все функции, вызванные из нее) и exclusive time(время, потраченное на функцию без учета времени на вложенные функции).

Дополнительно, XHprof поддерживает сравнение двух запусков (иерархический DIFF отчет) и умеет объединять несколько запусков для усреднения данных. 

Установка XHprof

С 1 июня 2009 года (версия 0.9.2, начиная с PHP 5.2.0) XHprof предоставляется как PECL-пакет. Между прочим,  для Windows не доступен.

Процесс  установки:

 pecl download xhprof-0.9.2
tar -xvf xhprof-0.9.2.tar.gz
cd xhprof-0.9.2/extension
phpize
./configure
make
make install

Далее нужно подключить модуль в php.ini:

extension=xhprof.so
xhprof.output_dir=/var/log/xhprof;

 

Настройка интерфейса отчетов

Модуль XHprof имеет возможность построение текстовых и графических отчетов.

В установочной директории xhprof-0.9.2 есть  две папки xhprof_html (доступ к UI и GUI) и xhprof_lib (библиотека для анализа данных).

Вторую папку в зависимости от ОС нужно разместить в /usr/local/share/php/ или /usr/local/lib/php/ (обеспечивая этим глобальный доступ к библиотеке). 

Дальше нужно сделать доступ к UI. Для этого на сервере нужно создать новый домен или сабдомен и разместить в него папку xhprof_html (как вариант сюда можно разместить и xhprof_lib).

Запуск и использование профайлера, основные функции

Для запуска профайлера:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Здесь XHPROF_FLAGS_CPU и XHPROF_FLAGS_MEMORY указывают профайлеру, что нужно собирать данные и об использовании процессора и об оперативной памяти.

Остановка работы профайлера:

$xhprof_data = xhprof_disable();

Сохранение данных:

include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_lib.php';
include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_runs.php';
$namespace = $_SERVER['SERVER_NAME']; 
$xhprof_runs = new XHProfRuns_Default(); 
$run_id = $xhprof_runs->save_run($xhprof_data, $namespace);

Генерируем ссылку для просмотра отчетов:   

print sprintf('http://<xhprof_domain>/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace);

 

Графический интерфейс

XHprof имеет в себе, также, встроенный графический интерфейс.

Особой ценности, как по мне, он не предоставляет, но не вспомнит о нем в этой статье не имею права :)

Для его работы нужно чтобы на сервере было установлено приложение Graphviz (входит в большинство дистрибутивов Linux’a). После настройки html интерфейса Вы уже можете использовать и графический без каких либо других движений (ссылка [View Full Callgraph] в отчетах).

При первом использовании очень часто стыкаются с следующей ошибкой:

Warning: proc_open() [function.proc-open]: open_basedir restriction in effect. File(/dev/null) is not within the allowed path(s)

 Это значит, что у пользователя, от имени которого выполняется скрипт, нет доступа к нулл девайсу (/dev/null). Варианта два: разрешить такой доступ с помощью свойства open_basedir в php.ini или изменить строчку 108 файла /xhprof_lib/utils/callgraph_utils.php заменив "/dev/null" на  любое значение, к которому наш скрипт будет иметь доступ (я, например, для тестинга заменял на "/tmp/xhprof_stderr").

Профилирование «живых» приложений

Понятное дело что профилирование в тестовой среде может очень сильно отличаться от того, что мы имеем на живом сайте.

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

То есть его можно смело использовать на живых проектах. Например, можно сделать запуск только раз в сто запросов к серверу:

if (rand(1, 100) == 1) { 
   xhprof_enable(XHPROF_FLAGS_MEMORY); 
   $xhprof_enable = TRUE; 
 } 

// исполнение приложение 

 if ($xhprof_enable) { 
   $xhprof_data = xhprof_disable(); 
   // сохраняем данные 
 }

Так же профайлер имеет в себе встроенный режим «Легких сэмплов» («Lightweight Sampling»), после включения которого профилирование будет осуществляться в течении малых промежутков времени (100 миллисекунд). Для подключение нужно просто заменить функции старта/остановки профайлера на следующие:  xhprof_sample_enable (вместо xhprof_enable), xhprof_sample_disable (вместо xhprof_disable) .

Дополнительная информация

Наиболее обширную информация о профайлере можно найти на страничке разработчиков (между прочем, это не кто там а сам FaceBook Inc):

http://mirror.facebook.com/facebook/xhprof/doc.html