XHprof - профилирование PHP от Facebook

PHP был и остается одной из самых популярных платформ для разработки Web приложений любого уровня сложности и размера. О преимуществах этой технологии мы поговорим отдельно, а сегодня исследуем вопрос профилирования PHP.
Не забывая о главных правилах масштабируемых приложений следует еще раз подчеркнуть важность инструментов по сбору статистики различных технологичных аспектов Вашей системы.
Рассмотрим решение от создателей Facebook - XHProf.
Зачем профилировать?
Медленный код - это зачастую только предположение, что медленный именно код. В большинстве случаев проблема медленной работы кроется вне кода системы. Профилирование помагает вычислить наиболее медленные места в коде и, в случае необходимости, устранить их.
Профилирование работает по принципу декомпозиции системы на вызовы функций (методов) и построения статистики в разрезе их ресурсопотребления. В результате Вы знаете, есть ли проблемы и где они. К тому же прочему данный анализ поможет идеально подстроить параметры платформы (количество выделяемой памяти, максимальное время исполнения и т.п.).
В общем смысле профилирование поможет найти медленные куски кода. Причина, по которой они работают медленно не обязательно может быть связана с PHP, но это поможет локализовать проблему.
Установка XHProf
С недавних пор xhprof стал входить в пакеты PECL, поэтому установка очень простая:
pecl install xhprof-0.9.2
Поскольку последняя версия на текущий момент еще не имеет стабильной пометки, то нужно указывать текущую версию при установке. Иногда при установке через PECL возникают проблемы (как у меня), тогда нужно установить руками:
pecl download xhprof-0.9.2 tar -xvf xhprof-0.9.2.tar.gz cd xhprof-0.9.2/extension phpize ./configure --with-php-config=make make install
Не удаляйте установочную папку, т.к. она содержит утилиты для GUI части профайлера. После этого добавляем модуль в php.ini:
extension=xhprof.so xhprof.output_dir=/var/log/xhprof ; Путь к папке, куда профайлер будет складывать данные для последующего построения отчетов
Настройка GUI
В пакет XHprof входит очень удобный интерфейс для анализа отчетов профилирования.
В устновочной папке Вы найдете папку xhprof_html, которую нужно поставить корнем в Вашем виртуальном хосте (из которого Вы хотите смотреть отчеты). В нашем примере ниже этот хост называется http://xhprof/.
Также в установочной папке есть библиотеки для генерации и сохранения отчетов - xhprof_lib - их нужно будет использовать в скриптах, которые профилируются.
Практика
Напишем небольшой скрипт для проверки профайлера на практике:
function user_array_intersect( $a, $b ) {
$res = array();
foreach ( $a as $k => $v )
{
if ( in_array($v, $b) )
{
$res[] = $v;
}
}
return $res;
}
function execute()
{
$a = range(rand(100, 300), rand(700, 900));
$b = range(rand(100, 300), rand(700, 900));
$r1 = user_array_intersect($a, $b);
$r2 = array_intersect($a, $b);
}
# Инициализируем профайлер - будем считать и процессорное время и потребление памяти
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
# Выполняем "прогамму"
execute();
# Останавливаем профайлер
$xhprof_data = xhprof_disable();
# Сохраняем отчет и генерируем ссылку для его просмотра
include_once "xhprof_lib/utils/xhprof_lib.php";
include_once "xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test");
echo "Report: http://xhprof/index.php?run=$run_id&source=xhprof_test"; # Хост, который Вы настроили ранее на GUI профайлера
echo "\n";
В этом скрипте мы сравним отличие в эффективности работы встроенной функции array_intersect и ее самописного клона user_array_intersect. После описания функций мы подключили профайлер для генерации и сохранения отчета. Посмотрим на отчет:
Из отчета видно, что эффективность собственной реализации функции array_intersect в два раза меньше встроенной (еще одно напоминание об использовании стандартных средств прежде всего!). Небольшая справка по терминологии отчетов:
- Incl[usive] Time - время, потраченное на функцию и на все функции, вызванные из нее
- Excl[usive] Time - время, потраченное на функцию без учета времени на вложенные функции
На скриншоте показана только часть отчета, кроме этих показателей отчет также содержит статистику по процессорным затратам и использованной памяти.
Графические отчеты
XHprof позволяет строить графические отчеты. Для построения он использует внешний инструмент Graphviz, поэтому убедитесь, что он установлен (обычно он входит в стандартные пакеты дистрибутивов Linux). Графический отчет нашего скрипта выглядит так:
Графический отчет позволяет визуально оценить ресурсоемкость каждой функции (красный должен привлечь внимание!). Как видим, в нашем примере самой затратной функцией для ресурсов стала in_array(), которая сама по себе не является проблемой но говорит о плохом техническом решении.
Профилирование приложений вживую
Профилирование приложения в режиме разработки с тестовыми данными может дать очень большую погрешность при обнаружении реальных проблем. Именно поэтому очень остро стоит вопрос об использовании профилирующих инструментов в production средах. Главный критерий - влияние на производительность.
XHprof очень хорошо подходит для использования в “продуктивных” средах, т.к. создавался именно с этой целью. Во-первых это расширение является нативным, что подразумевает хорошие показатели в его производительности. Во-вторых XHprof имеет ряд настроек для работы на продуктивных серверах:
- Таймер CPU на Linux системах имеет большой оверхед, поэтому разработчики рекомендуют использовать профайлер в режиме “elapsed time + memory”:
xhprof_enable(XHPROF_FLAGS_MEMORY);
- Сбор данных профайлера будет весьма точно отражать реальную картину, если его запускать не каждый раз, а случайно и равнораспределенно, например для запуска каждый сотый раз:
if (mt_rand(1, 100) == 1) { xhprof_enable(XHPROF_FLAGS_MEMORY); $xhprof_on = true; } ... if ($xhprof_on) { $xhprof_data = xhprof_disable(); } - Режим Lightweight Sampling - в этом режиме профилирование выполняется в течении короткого промежутка во времени (сэмплами) - 0.1 секунды
Полная документация проекта доступна тут.


Удобная тулза, надо будет заюзать
Хорошее решение, под win32 порта нехватает для полноценного использования
Ден есть еще неплохой профайлер у xdebug. Должно быть ты уже читал на хабре(поищи в разделе php если не читал еще)? Для его использования не нужно включать в код вызовов доп функций… http://xdebug.org/docs/profiler
@Дмитрий
Спасибо, уже смотрел, но загляну еще раз
Заинтересовало решение xhprof, т.к. оно предназначено для профилирования на работающих системах (малый оверхед при правильных настройках).