Главная > Теория и практика > XHprof - профилирование PHP от Facebook

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

php

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. После описания функций мы подключили профайлер для генерации и сохранения отчета. Посмотрим на отчет:

screenshot-xhprof-hierarchical-profiler-report-mozilla-firefox

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

  • Incl[usive] Time - время, потраченное на функцию и на все функции, вызванные из нее
  • Excl[usive] Time - время, потраченное на функцию без учета времени на вложенные функции

На скриншоте показана только часть отчета, кроме этих показателей отчет также содержит статистику по процессорным затратам и использованной памяти.

Графические отчеты

XHprof позволяет строить графические отчеты. Для построения он использует внешний инструмент Graphviz, поэтому убедитесь, что он установлен (обычно он входит в стандартные пакеты дистрибутивов Linux). Графический отчет нашего скрипта выглядит так:

callgraphphp

Графический отчет позволяет визуально оценить ресурсоемкость каждой функции (красный должен привлечь внимание!). Как видим, в нашем примере самой затратной функцией для ресурсов стала 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 секунды

Полная документация проекта доступна тут.

Google Bookmarks Digg I.ua Ru-marks Ruspace Zakladok.net Reddit delicious Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru rucity.com

Статьи по теме

  1. IgorN
    21 Август 2009 в 12:52 | #1

    Удобная тулза, надо будет заюзать

  2. 23 Август 2009 в 18:36 | #2

    Хорошее решение, под win32 порта нехватает для полноценного использования :(

  3. Дмитрий
    18 Ноябрь 2009 в 13:09 | #3

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

  4. 18 Ноябрь 2009 в 15:50 | #4

    @Дмитрий
    Спасибо, уже смотрел, но загляну еще раз :)
    Заинтересовало решение xhprof, т.к. оно предназначено для профилирования на работающих системах (малый оверхед при правильных настройках).

  1. 13 Декабрь 2009 в 18:32 | #1