Профілювання PHP-коду. XHprof — ієрархічний профайлер з html-інтерфейсом

06.03.2011
PHP-code profiling. XHprof — hierarchical profiler with html-interface
Автор:

Що таке профілювання?

Профілювання - це процес аналізу роботи додатку для збору інформації про продуктивність (збір набору характеристик - час, використання оперативної пам'яті і ресурсів процесора, кількість викликів функцій і так далі). Відповідно інструмент, який використовується для цього, називається профайлером.

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

Профілювання PHP-коду

Найбільш відомими PHP-профайлерами є:

Xdebg's Profiler (http://www.xdebug.org/docs/profiler), i XHprof (http://pecl.php.net/package/xhprof). Про другий і піде мова.

Про XHprof

XHprof  - це ієрархічний профайлер для PHP з 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_domain>/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 мілісекунд). Для підключення потрібно просто замінити функції старту/зупинки профайлера на наступні hprof_sample_enable (замість xhprof_enable), xhprof_sample_disable (замість xhprof_disable).

2 votes, Рейтинг: 5

Також по темі

1

Дуже багато раз мене питали як у випадаючому списку фільтра модуля views перекласти елемент "Any".

Так! Стандартно, перекладом інтерфейсу, це не зробити.

2

Що таке CDN? Кому і нащо потрібно використовувати CDN? Все це описується в нашому блог-пості.

3

Скрипт cron.php використовується в Друпалі для індексації контенту, відправки листів підписникам, збору rss-фідів, видалення старої статистики і т.п. Детальніше про скрипт читайте у нашому блозі...

4

По перше, що таке Apache Solr?

Apache Solr - це розширювана пошукова платформа з відкритим вихідним кодом для проекту Apache Lucene.

5

На серверах з nginx в якості фронтенду і Apache в якості бекенду часто можна побачити таку помилку. Зазвичай думають, що проблема в nginx і починають його пиляти....

Subscribe to our blog updates