Профилирование PHP с XHprof. Профилирование PHP-кода С помощью дополнительных параметров интерпретатора

Профилирование PHP с XHprof. Профилирование PHP-кода С помощью дополнительных параметров интерпретатора

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

Рано или поздно каждый из нас сталкивается с унаследованным кодом и его оптимизацией. Дебаггер и профилировшик в такой ситуации - лучшие помощники программиста. У тех кто работает с PHP, благодаря Дерику Ретансу (Derick Rethans) есть хороший инструмент - xDebug. Информации касательно xDebug много даже в рунете, поэтому речь в этой статье пойдет не о нем.

Наткнувшись на упоминание о профилировщике для PHP я сразу подумал об xDebug (о проприетарных инструментах от Zend я давно уже успел позабыть), но на этот раз ошибся - речь пойдет об XHProf.
XHProf

Этот профилировшик был разработан специально для Facebook, а исходный код его был открыт в марте 2009 года.

Установка прошла достаточно быстро и гладко.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension/
phpize
./configure && make && make install
cd /usr/local/etc/php.d/
vim xhprof.ini
cd /usr/local/
vim header.php
vim footer.php
vim etc/php.ini
/etc/init.d/php-fpm restart
cp vhost.conf.template prof.my.conf
sed -i s/site/prof/ prof.my.conf
vim prof.my.conf
/etc/init.d/nginx restart

Разберем упомянутые конфиги

Xhprof.ini
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xhprof.so
xhprof.output_dir="/home/max/www/profile/"

Prof.my.conf - конфиг нгинкса - самый стандартный.

Server {
listen 80;
server_name prof.my;
charset utf8;

Root /usr/local/src/xhprof-0.9.2/xhprof_html ;
location / {
index index.php;
}

Location ~ \.php$ {
fastcgi_pass 127.0.0.1:12000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
include fastcgi_params;

В /usr/local/src/xhprof-0.9.2/xhprof_html лежат PHP-исходники, создающие неплохой WEBGUI к профайлеру.

Итак о двух главных файлах:

Header.php


include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php";
include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php";
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
}

Footer.php
if(isset($_COOKIE["xhprof"])){
if (extension_loaded("xhprof")) {
$profiler_namespace = "myapp"; // namespace for your application
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);

// url to the XHProf UI libraries (change the host name and path)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
echo << Profiler output
OUT;
}
}

Теперь запускаем любой PHP-скрипт через веб и видим в левом верхнем углу ссылку на вывод профилировщика - именно для этого и был создан хост prof.my

Обратите внимание - я использую проверку на COOKIE! При такой проверке можно безопасно использовать профилировщик на production-сервере - на реальных данных и реальной загрузке.

Веб-интерфейс профилировщика выводит таблички с информацией о каждой функции и сообщает следующую информацию:

  • Число вызовов каждой функции
  • Wall-time, время затраченное на выполнение функций (включая ожидание ответов от сокетов, файловой системы и т.д.).
  • CPU-time, время затраченное на выполнение функций (исключая ожидание ответов от сокетов, файловой системы и т.д.).
  • Использование памяти
  • Пиковое использование памяти

Есть возможность сортировки таблицы по любому из параметров

Информация по каждой функции делится еще на два вида Inclusive и Exclusive. Inclusive включает цифры использованные дочерними вызовами, а Exclusive не включает их. Так же есть возможность, кликнув на название функции увидеть информацию только по ней и функциям из которых она вызывалась и которые вызывались ей.

Если в системе установлен GraphViz, профилировщик нарисует вам граф вызовов.

P.S. Не нарушая традиций: это мой первый пост на хабре.

UPD: перепостил в PHP.

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

XHProf и его форк Tideways - удобный и простой профайлер, который способен эффективно собирать статистику о работе приложения почти без снижения скорости работы вашего приложения (или вашего сайта).

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

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

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

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

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

Как подключить php-профайлер в автоматическом режиме?

Наши специалисты потрудились и сделали данный процесс абсолютно автоматизированным.
Вам достаточно авторизоваться в , во вкладке «Домены» выбрать нужный домен, кликнуть по иконке «PHP.INI + PHP Профайлер» и включить чекбокс «Профайлер для домена».

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

Для php версий 5.2, 5.3, 5.4, 5.5, 5.6, 7.0 мы используем профайлер XHProf , для php версии 7.1 и выше мы используем профайлер Tideways .

После включения на каждой странице вашего сайта, обрабатываемой php, в нижнюю её часть будет встроен специальный блок со ссылками на файл отчёта (ссылка будет выглядеть примерно так:

Domain-name.com/xhprof-master/xhprof_html/index.php?run=XXXXXXXXXXXX&source=someapp)

А вот как будет выглядеть файл отчета:

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

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

Нужно заметить, что отчет, построенный с помощью tideways, может немного визуально отличаться от этого отчета, но суть от этого не меняется.

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


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

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

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

Domain-name.com/xhprof-master/xhprof_html/index.php?run=XXXXXXXXXXXX,YYYYYYYYYYY&source=someapp

Технические особенности

    Автоматическое включение профайлера реализовано с помощью директив auto_append_file и auto_prepend_file , которые подключают два исполняемых php файла:

    — auto_append_file выполняет инициализацию объекта сбора статистики и запускает его работу;

    — auto_prepend_file завершает сбор статистики и генерирует файл-отчет со статистикой (в формате JSON);

    Если в процессе выполнения вашего скрипта будет вызвана функция exit() или die(), то auto_prepend_file не будет выполнен, файл статистики не будет сгенерирован и в нижнюю часть страницы не будет включен блок, со ссылками на файл отчета.

  1. Таким образом обращение к любой странице, обрабатываемой php, будет инициировать создание нового файла отчета, поэтому мы рекомендуем отключить профайлер после сбора статистики (обычно для этого хватает нескольких часов), во избежание переполнения дисковой квоты, которая может исчерпаться после генерации большого количества отчетов!
  2. Важно: профайлер будет работать только если сайт прикреплен к серверу по стандартному пути, автоматическими средствами (то есть, с помощью панели управления хостингом), в противном случае для настройки профайлера вам нужно обратиться в техническую поддержку Hostland.
  3. В автоматическом режиме профайлер подключается только к основному доменному имени, к поддоменам автоматического подключение профайлера не предусмотрено.
  4. В автоматическом режиме профайлер собирает статистику только скриптов с расширением.php и.php5
  5. Не возможно гарантировать бесперебойную работу сайта после подключения php-профайлера, поэтому, в случае некорректной работы сайта во время включенного профайлера его следует отключить и продолжить профилирование другими средствами.

Подведём итоги

Мы будем надеяться, что данный инструмент поможет вам сделать ваши сайты еще более быстрыми на хостинге Hostland.

В статье частично использованы материалы пользователя Den Golotyuk размещенные на сайте


Иногда ошибки ViewProfile.swf и другие системные ошибки SWF могут быть связаны с проблемами в реестре Windows. Несколько программ может использовать файл ViewProfile.swf, но когда эти программы удалены или изменены, иногда остаются "осиротевшие" (ошибочные) записи реестра SWF.

В принципе, это означает, что в то время как фактическая путь к файлу мог быть изменен, его неправильное бывшее расположение до сих пор записано в реестре Windows. Когда Windows пытается найти файл по этой некорректной ссылке (на расположение файлов на вашем компьютере), может возникнуть ошибка ViewProfile.swf. Кроме того, заражение вредоносным ПО могло повредить записи реестра, связанные с Bioshock 2. Таким образом, эти поврежденные записи реестра SWF необходимо исправить, чтобы устранить проблему в корне.

Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей ViewProfile.swf не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!

В связи с подобным риском мы настоятельно рекомендуем использовать надежные инструменты очистки реестра, такие как WinThruster (разработанный Microsoft Gold Certified Partner), чтобы просканировать и исправить любые проблемы, связанные с ViewProfile.swf. Используя очистку реестра , вы сможете автоматизировать процесс поиска поврежденных записей реестра, ссылок на отсутствующие файлы (например, вызывающих ошибку ViewProfile.swf) и нерабочих ссылок внутри реестра. Перед каждым сканированием автоматически создается резервная копия, позволяющая отменить любые изменения одним кликом и защищающая вас от возможного повреждения компьютера. Самое приятное, что устранение ошибок реестра может резко повысить скорость и производительность системы.


Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.

Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с ViewProfile.swf (например, Bioshock 2):

  1. Нажмите на кнопку Начать .
  2. Введите "command " в строке поиска... ПОКА НЕ НАЖИМАЙТЕ ENTER !
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER .
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да .
  6. Черный ящик открывается мигающим курсором.
  7. Введите "regedit " и нажмите ENTER .
  8. В Редакторе реестра выберите ключ, связанный с ViewProfile.swf (например, Bioshock 2), для которого требуется создать резервную копию.
  9. В меню Файл выберите Экспорт .
  10. В списке Сохранить в выберите папку, в которую вы хотите сохранить резервную копию ключа Bioshock 2.
  11. В поле Имя файла введите название файла резервной копии, например "Bioshock 2 резервная копия".
  12. Убедитесь, что в поле Диапазон экспорта выбрано значение Выбранная ветвь .
  13. Нажмите Сохранить .
  14. Файл будет сохранен с расширением.reg .
  15. Теперь у вас есть резервная копия записи реестра, связанной с ViewProfile.swf.

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

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

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

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

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

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

Проблема Xdebug

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

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

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

XHProf

Установка

На Debian XHprof есть в sid пакетах, поэтому: apt-get install xhprof

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

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

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

execute();

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

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

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

# Инициализируем профайлер 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

После этого необходимо внести изменения в скрипт:

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..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

После этого появится список отчетов:

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

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

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

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

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

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

Интерфейс XHprof также позволяет просматривать агрегатную информацию сразу с нескольких отчетов. Для этого run_id передаются через запятую: http://xh..php?run=53a894f6d5d9b,53a894fcf126e &source=test

TL;DR

Используйте XHprof для профилирования PHP прямо в продакшне.

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

Школьный этимологический словарь русского языка. Происхождение слов. - М.: Дрофа . Н. М. Шанский, Т. А. Боброва . 2004 .

Смотреть что такое "балакать" в других словарях:

    балакать - беседовать, болтать, калякать (Даль) См … Словарь синонимов

    БАЛАКАТЬ - БАЛАКАТЬ, балакаю, балакаешь, несовер. (обл.). Болтать, разговаривать. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 … Толковый словарь Ушакова

    БАЛАКАТЬ - южн. балякать пермяц. беседовать, болтать, раздобаривать, калякать. Балаканье ср. болтовня. Балакуша, балака ·об., южн., баляка пермяц., балакарь, болтун, говорун. Балакарить, быть шутом, шутить, как шуты должностные. Балакирь муж., ниж., каз.,… … Толковый словарь Даля

    балакать - болтать, молоть чепуху, укр. балакати, блр. балакаць, польск. baɫakac. К баять или балаболить; см. Бернекер 1, 40; Mi. EW 5. Другая ступень чередования гласного: укр. пробовкнути буркнуть, польск. beɫknąc – то же, чеш. blknouti; ср. Шахматов,… … Этимологический словарь русского языка Макса Фасмера

    Балакать - несов. перех. и неперех. разг. Говорить, болтать. Толковый словарь Ефремовой. Т. Ф. Ефремова. 2000 … Современный толковый словарь русского языка Ефремовой

    балакать - балакать, балакаю, балакаем, балакаешь, балакаете, балакает, балакают, балакая, балакал, балакала, балакало, балакали, балакай, балакайте, балакающий, балакающая, балакающее, балакающие, балакающего, балакающей, балакающего, балакающих,… … Формы слов