PHP 8.4.22 Released!

Работа утилиты bpftrace со статическими зондами PHP DTrace

В дистрибутивах Linux с ядром, которое поддерживает eBPF, утилита bpftrace умеет подключаться к зондам PHP DTrace USDT напрямую, без необходимости использовать SystemTap.

Установка bpftrace

Установите bpftrace через менеджер пакетов дистрибутива. Например, в Oracle Linux, RHEL или Fedora:

# dnf install bpftrace
Или в Debian либо Ubuntu:
# apt install bpftrace

Приведённые ниже примеры предполагают, что целевой исполняемый файл PHP установлен в /usr/bin/php.

Те же зонды USDT предоставляют и другие SAPI, которые собрали из того же дерева исходного кода, поэтому целью зондов вместо этого выступает либо модуль Apache (libphp.so), либо исполняемый файл диспетчера процессов FastCGI (php-fpm); подставьте подходящий путь или подключитесь по PID-идентификатору через ключ -p при необходимости.

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

Статические зонды PHP умеет выводить команда bpftrace:

# bpftrace -l 'usdt:/usr/bin/php:php:*'

Команда выводит:

usdt:/usr/bin/php:php:compile__file__entry
usdt:/usr/bin/php:php:compile__file__return
usdt:/usr/bin/php:php:error
usdt:/usr/bin/php:php:exception__caught
usdt:/usr/bin/php:php:exception__thrown
usdt:/usr/bin/php:php:execute__entry
usdt:/usr/bin/php:php:execute__return
usdt:/usr/bin/php:php:function__entry
usdt:/usr/bin/php:php:function__return
usdt:/usr/bin/php:php:request__shutdown
usdt:/usr/bin/php:php:request__startup

Пример #1 Скрипт all_probes.bt — трассировка всех статических PHP-зондов через bpftrace

#!/usr/bin/env bpftrace

usdt:/usr/bin/php:php:compile__file__entry
{
    printf("Probe compile__file__entry\n");
    printf("  compile_file %s\n", str(arg0));
    printf("  compile_file_translated %s\n", str(arg1));
}
usdt:/usr/bin/php:php:compile__file__return
{
    printf("Probe compile__file__return\n");
    printf("  compile_file %s\n", str(arg0));
    printf("  compile_file_translated %s\n", str(arg1));
}
usdt:/usr/bin/php:php:error
{
    printf("Probe error\n");
    printf("  errormsg %s\n", str(arg0));
    printf("  request_file %s\n", str(arg1));
    printf("  lineno %d\n", (int32)arg2);
}
usdt:/usr/bin/php:php:exception__caught
{
    printf("Probe exception__caught\n");
    printf("  classname %s\n", str(arg0));
}
usdt:/usr/bin/php:php:exception__thrown
{
    printf("Probe exception__thrown\n");
    printf("  classname %s\n", str(arg0));
}
usdt:/usr/bin/php:php:execute__entry
{
    printf("Probe execute__entry\n");
    printf("  request_file %s\n", str(arg0));
    printf("  lineno %d\n", (int32)arg1);
}
usdt:/usr/bin/php:php:execute__return
{
    printf("Probe execute__return\n");
    printf("  request_file %s\n", str(arg0));
    printf("  lineno %d\n", (int32)arg1);
}
usdt:/usr/bin/php:php:function__entry
{
    printf("Probe function__entry\n");
    printf("  function_name %s\n", str(arg0));
    printf("  request_file %s\n", str(arg1));
    printf("  lineno %d\n", (int32)arg2);
    printf("  classname %s\n", str(arg3));
    printf("  scope %s\n", str(arg4));
}
usdt:/usr/bin/php:php:function__return
{
    printf("Probe function__return\n");
    printf("  function_name %s\n", str(arg0));
    printf("  request_file %s\n", str(arg1));
    printf("  lineno %d\n", (int32)arg2);
    printf("  classname %s\n", str(arg3));
    printf("  scope %s\n", str(arg4));
}
usdt:/usr/bin/php:php:request__shutdown
{
    printf("Probe request__shutdown\n");
    printf("  file %s\n", str(arg0));
    printf("  request_uri %s\n", str(arg1));
    printf("  request_method %s\n", str(arg2));
}
usdt:/usr/bin/php:php:request__startup
{
    printf("Probe request__startup\n");
    printf("  file %s\n", str(arg0));
    printf("  request_uri %s\n", str(arg1));
    printf("  request_method %s\n", str(arg2));
}

Приведённый скрипт трассирует все статические зонды ядра PHP на всём протяжении работы PHP-скрипта. Утилите bpftrace требуются привилегии суперпользователя:

# USE_ZEND_DTRACE=1 bpftrace -c '/usr/bin/php test.php' all_probes.bt

Чтобы трассировать уже запущенный PHP-процесс (например, рабочий процесс php-fpm или процесс Apache, который загрузил libphp.so), подключитесь по PID-идентификатору:

# bpftrace -p $PID all_probes.bt
Путь цели usdt: в скрипте обязан совпадать с исполняемым файлом запущенного процесса; скорректируйте usdt:/usr/bin/php до исполняемого файла php-fpm или libphp.so при необходимости.

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top