PHP ΠΈ DTrace

PHP конфигурируСтся со статичСскими Π·ΠΎΠ½Π΄Π°ΠΌΠΈ DTrace Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ трассировку DTrace.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ PHP со статичСскими Π·ΠΎΠ½Π΄Π°ΠΌΠΈ DTrace

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ DTrace Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС. НапримСр, Π² Oracle Linux трСбуСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ядро UEK3 ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

# modprobe fasttrap
# chmod 666 /dev/dtrace/helper

ВмСсто chmod доступСн ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ» ACL для ограничСния доступа для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π‘Π±ΠΎΡ€ΠΊΠ° PHP с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ --enable-dtrace:

# ./configure --enable-dtrace ...
# make
# make install

Π‘Π±ΠΎΡ€ΠΊΠ° PHP с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ --enable-dtrace сдСлаСт статичСскиС Π·ΠΎΠ½Π΄Ρ‹ доступными Π² ядрС PHP. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ PHP-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт свои Π·ΠΎΠ½Π΄Ρ‹, потрСбуСтся ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΊ раздСляСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

УстановитС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ срСды USE_ZEND_DTRACE=1 для Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… PHP-процСссов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·ΠΎΠ½Π΄Ρ‹.

БтатичСскиС Π·ΠΎΠ½Π΄Ρ‹ DTrace Π² ядрС PHP

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ статичСскиС Π·ΠΎΠ½Π΄Ρ‹ доступны Π² PHP
НазваниС Π·ΠΎΠ½Π΄Π° ОписаниС Π·ΠΎΠ½Π΄Π° АргумСнты Π·ΠΎΠ½Π΄Π°
request-startup Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈ Π½Π°Ρ‡Π°Π»Π΅ запроса. char *file, char *request_uri, char *request_method
request-shutdown Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ запроса. char *file, char *request_uri, char *request_method
compile-file-entry Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° начинаСтся компиляция скрипта. char *compile_file, char *compile_file_translated
compile-file-return Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° заканчиваСтся компиляция скрипта. char *compile_file, char *compile_file_translated
execute-entry Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° запускаСтся массив Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, возобновляСтся Ρ€Π°Π±ΠΎΡ‚Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ происходит include. char *request_file, int lineno
execute-return Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, послС ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ массива Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. char *request_file, int lineno
function-entry Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π΄Π²ΠΈΠΆΠΎΠΊ PHP Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ запуск Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. char *function_name, char *request_file, int lineno, char *classname, char *scope
function-return Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π΄Π²ΠΈΠΆΠΎΠΊ PHP возвращаСтся ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. char *function_name, char *request_file, int lineno, char *classname, char *scope
exception-thrown Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. char *classname
exception-caught Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΉΠΌΠ°Π½ΠΎ. char *classname
error Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка, нСзависимо ΠΎΡ‚ уровня error_reporting. char *errormsg, char *request_file, int lineno

ΠœΠΎΠ΄ΡƒΠ»ΠΈ PHP ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·ΠΎΠ½Π΄Ρ‹.

Бписок статичСских Π·ΠΎΠ½Π΄ΠΎΠ² DTrace Π² PHP

ЗапуститС PHP-процСсс ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Π·ΠΎΠ½Π΄ΠΎΠ²:

# dtrace -l

Команда Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

   ID   PROVIDER            MODULE                          FUNCTION NAME
   [ . . . ]
    4   php15271               php               dtrace_compile_file compile-file-entry
    5   php15271               php               dtrace_compile_file compile-file-return
    6   php15271               php                        zend_error error
    7   php15271               php  ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught
    8   php15271               php     zend_throw_exception_internal exception-thrown
    9   php15271               php                 dtrace_execute_ex execute-entry
   10   php15271               php           dtrace_execute_internal execute-entry
   11   php15271               php                 dtrace_execute_ex execute-return
   12   php15271               php           dtrace_execute_internal execute-return
   13   php15271               php                 dtrace_execute_ex function-entry
   14   php15271               php                 dtrace_execute_ex function-return
   15   php15271               php              php_request_shutdown request-shutdown
   16   php15271               php               php_request_startup request-startup

Колонка Provider содСрТит надпись php ΠΈ PID-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ PHP-процСсса.

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π²Π΅Π±-сСрвСра Apache Π½Π°Π·Π²Π°Π½ΠΈΠ΅ модуля выводится ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, libphp5.so, ΠΈ выводятся сСрия Π±Π»ΠΎΠΊΠΎΠ² списка, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс Apache.

Колонка Function ссылаСтся Π½Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π‘-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PHP, которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·ΠΎΠ½Π΄.

Бписок Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·ΠΎΠ½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны с PHP, Ссли PHP Π½Π΅ запустили.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ DTrace с PHP

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности скриптового языка DTrace D.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 Π‘ΠΊΡ€ΠΈΠΏΡ‚ all_probes.d β€” трассировка статичСских PHP-Π·ΠΎΠ½Π΄ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· DTrace

#!/usr/sbin/dtrace -Zs

#pragma D option quiet

php*:::compile-file-entry
{
    printf("PHP compile-file-entry\n");
    printf("  compile_file              %s\n", copyinstr(arg0));
    printf("  compile_file_translated   %s\n", copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("PHP compile-file-return\n");
    printf("  compile_file              %s\n", copyinstr(arg0));
    printf("  compile_file_translated   %s\n", copyinstr(arg1));
}

php*:::error
{
    printf("PHP error\n");
    printf("  errormsg                  %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
}

php*:::exception-caught
{
    printf("PHP exception-caught\n");
    printf("  classname                 %s\n", copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("PHP exception-thrown\n");
    printf("  classname                 %s\n", copyinstr(arg0));
}

php*:::execute-entry
{
    printf("PHP execute-entry\n");
    printf("  request_file              %s\n", copyinstr(arg0));
    printf("  lineno                    %d\n", (int)arg1);
}

php*:::execute-return
{
    printf("PHP execute-return\n");
    printf("  request_file              %s\n", copyinstr(arg0));
    printf("  lineno                    %d\n", (int)arg1);
}

php*:::function-entry
{
    printf("PHP function-entry\n");
    printf("  function_name             %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
    printf("  classname                 %s\n", copyinstr(arg3));
    printf("  scope                     %s\n", copyinstr(arg4));
}

php*:::function-return
{
    printf("PHP function-return\n");
    printf("  function_name             %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
    printf("  classname                 %s\n", copyinstr(arg3));
    printf("  scope                     %s\n", copyinstr(arg4));
}

php*:::request-shutdown
{
    printf("PHP request-shutdown\n");
    printf("  file                      %s\n", copyinstr(arg0));
    printf("  request_uri               %s\n", copyinstr(arg1));
    printf("  request_method            %s\n", copyinstr(arg2));
}

php*:::request-startup
{
    printf("PHP request-startup\n");
    printf("  file                      %s\n", copyinstr(arg0));
    printf("  request_uri               %s\n", copyinstr(arg1));
    printf("  request_method            %s\n", copyinstr(arg2));
}

Для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ dtrace скрипт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΏΡ†ΠΈΡŽ -Z ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π΄Π°ΠΆΠ΅ Ссли Π½ΠΈ ΠΎΠ΄ΠΈΠ½ PHP-процСсс Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½. Π‘Π΅Π· ΠΎΠΏΡ†ΠΈΠΈ скрипт сразу ΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·ΠΎΠ½Π΄Π° для отслСТивания.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ отслСТиваСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ статичСский PHP-Π·ΠΎΠ½Π΄ Π½Π° всём протяТСнии Ρ€Π°Π±ΠΎΡ‚Ρ‹ PHP-скрипта. ЗапускаСм D-скрипт:

# ./all_probes.d

ЗапуститС скрипт ΠΈΠ»ΠΈ PHP-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ D-скрипт Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΡ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠ΅Π³ΠΎ Π·ΠΎΠ½Π΄Π°.

ПослС получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ скрипта ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ CTRL+C.

На многопроцСссорных ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… порядок Π·ΠΎΠ½Π΄ΠΎΠ² нСпослСдоватСлСн ΠΈ зависит ΠΎΡ‚ процСссоров, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π·ΠΎΠ½Π΄Ρ‹ ΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссорами. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΡƒΠ·ΠΎΠ². К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ:

php*:::function-entry
{
      printf("%lld: PHP function-entry ", walltimestamp);
      [ . . .]
}
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы