Категории
(262)
(73)
(42)
SEO
(25)

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

06.03.2011
Автор:

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

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

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

Профилирование 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_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) .

No votes yet. Be first

Также по теме

1

Очень много раз меня спрашивали, как в выпадающем списке фильтра модуля views перевести элемент "Any". Да, стандартно переводом интерфейса этого не сделать.

2

Что такое CDN? Сеть доставки (и дистрибуции) контента (англ. Content Delivery Network или Content Distribution Network, CDN) — географически распределённая сетевая инфраструктура, позволяющая...

3

Скрипт cron.php используется в Друпале для для работы поиска (индексация контента), отправки писем подписчикам, сбора rss-фидов, удаления "древней" статистики и т.д. - модули сами могут давать...

4

Во-первых, что такое Apache Solr?

Apache Solr - это расширяемая поисковая платформа с открытым исходным кодом от проекта Apache Lucene. 

5

На серверах с nginx в качестве фронтенда и Apache в качестве бэкенда часто можно увидеть такую ошибку. Обычно думают, что проблема в nginx и начинают его уверенно...

Need a quote? Let's discuss the project!

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join to peoples who already subscribe