[Хд] logo

Профилирование PHP с XHprof

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

XHProf — удобный и простой профайлер, который способен эффективно собирать статистику о работе приложения почти без оверхеда.

Зачем профилировать код?

Если приложение начинает работать медленно, профилирование позволит узнать, какая именно часть наиболее медленная. Результат профилирования обычно представляет собой список выполненных функций вместе со временем их выполнения. Профилирование

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

Профилирование — это процедура сбора и организации статистики о времени выполнения кода. Это не процесс оптимизации либо изменения программ. Результатом этого процесса обычно является расширенный отчет о компонентах программы. Статистика выполнения функций

Проблема Xdebug

Существует очень мощное решение для PHP — Xdebug. Утилита позволяет среди всего прочего профилировать код и анализировать статистику. Но сама платформа настолько тяжелая, что ее нельзя использовать на работающих сайтах — продуктивах. XDebug создает значительную дополнительную нагрузку на ресурсы сервера и замедляет приложение. XDebug и XHprof

С другой стороны, проблемы на "живом" сайте могут быть совершенно не такими, как в среде разработчика. Профилирование только на компьютерах разработчиков будет показывать только часть проблем, а также те проблемы, которых в реальном мире не существует. Без анализа на продуктиве Вы не сможете выяснить весь спектр проблем с производительностью.

Именно поэтому и было разработано решение XHprof. Оно предназначено для работы на реальных сайтах. Основная идея этого профайлера — создавать минимум нагрузки на приложение при этом собирать все необходимые данные о скорости работы. Решение разработано ребятами из Facebook.

XHProf

Установка

На Debian XHprof есть в sid пакетах, поэтому:

apt-get install php5-xhprof

Вы также можете собрать XHprof самостоятельно.

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

Допустим у нас есть страница с таким кодом:

<?
function execute()
{
  # Какой-то PHP код нашего приложения
}

execute();

Проведем профилирование с помощью XHprof. Для этого на этой странице необходимо:

  1. Включить профайлер в самом начале
  2. В самом конце программы остановить профайлер и сохранить полученный отчет

Это будет выглядеть так:

<?
function execute()
{
  # Какой-то PHP код нашего приложения
}


# Инициализируем профайлер
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);


# Выполняем программу после включения профайлера
execute();


# Останавливаем профайлер после выполнения программы
$xhprof_data = xhprof_disable();

# Сохраняем результат профилирования в переменную $xhprof_data

  • Функция xhprof_enable() принимает в качестве аргументов флаги. XHPROF_FLAGS_CPU для фиксирования статистики процессора, XHPROF_FLAGS_MEMORY — для памяти, XHPROF_FLAGS_NO_BUILTINS — для игнорирования встроенных функций.
  • xhprof_disable() выключит профайлер и вернет собранную статистику.

Отчеты

Генерация

Собранные данные можно проанализировать в интерфейсе XHprof для построения отчетов. Для этого, необходимо скачать исходники XHprof:

cd /var/www;
wget http://pecl.php.net/get/xhprof-0.9.4.tgz
gzip -d xhprof-0.9.4.tgz
tar -xvf xhprof-0.9.4.tar

После этого, необходимо внести изменения в нашу основную программу:

<?
...
$xhprof_data = xhprof_disable();
include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php";
include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "test");

# Новый код сохраняет отчет для использования в графическом интерфейсе

Интерфейс для отчетов

Чтобы увидеть отчет, необходимо настроить виртуальный хост на папку /var/www/xhprof-0.9.4/xhprof_html. Например, в Nginx:

server {
	server_name xh.ruhighload.com;
	root /var/www/xhprof-0.9.4/xhprof_html;
	index index.php;

	location ~* \.(php)$ {
        	fastcgi_pass 127.0.0.1:9000;
	        fastcgi_index index.php;
        	include fastcgi_params;
        	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	}
}
nginx -s reload

После этого на xh.ruhighload.com появится список отчетов: Отчеты Xhprof

Таблица содержит список функций, которые были выполнены в рамках одной страницы с дополнительной информацией:

  • Calls — количество и процентное соотношение вызовов функции
  • Incl. Wall Time — время выполнения функции с вложенными функциями
  • Excl. Wall Time — время выполнения функции без вложенных функций
  • Incl. CPU — процессорное время с вложенными функциями
  • Excl. CPU — процессорное время без вложенных функций
  • Incl. MemUse — потребление памяти с вложенными функциями
  • Excl. MemUse — потребление памяти без вложенных функций
  • Incl. PeakMemUse — максимальное потребление памяти с вложенными функциями
  • Excl. PeakMemUse — максимальное потребление памяти без вложенных функций

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

Чтобы построить графический отчет, убедитесь, что у Вас установлен graphviz:

apt-get install graphviz

После этого по ссылке [View Full Callgraph] будет доступна иерархия вызовов нашей страницы: Графический отчет Xhprof

Ресурсоемкие участки кода выделены желтым (средние) и красным (самые тяжелые). Это те участки кода, которые используют множество ресурсов относительно всей остальной программы. Это может быть одна медленная функция или большое количество вызовов быстрой функции. В нашем примере, мы видим, что функция str_replace() помечена красным из-за 262 вызовов.

Агрегатные отчеты

Интерфейс XHprof также позволяет просматривать агрегатную информацию сразу с нескольких отчетов. Для этого run_id передаются через запятую:

http://xh.ruhighload.com/index.php?run=53a894f6d5d9b,53a894fcf126e&source=test

Мерцание

Несмотря на малый оверхед, нагруженные приложения могут почувствовать разницу при включении Xhprof. Для того, чтобы максимально снизить нагрузку на приложение, профайлер позволяет работать в режиме мерцания. В этом случае сбор статистики будет проводиться не для всех вызовов, а только для части. Для включения режима необходимо использовать функции xhprof_sample_enable() и xhprof_sample_disable():

<?
...
xhprof_sample_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);


# Выполняем программу после включения профайлера
execute();


# Останавливаем профайлер после выполнения программы
$xhprof_data = xhprof_sample_disable();

Самое важное

XHprof предоставляет очень важную возможность — профилирование PHP приложений в продуктивных средах. Это дает возможность выяснить реальные проблемы в скорости приложения и сэкономить время на догадках. Режим мерцания позволяет использовать этот профайлер для крупных Web сайтов.

  read in english
[Хд]

Подписывайтесь на отборные материалы по продвинутой разработке

Google Email

Esc, чтобы подписаться позже