Динамическая трассировка DTraceВведение в PHP и DTrace
DTrace - это всегда доступный, практически не
потребляющий ресурсов фреймворк трассировки. Он
доступен на множестве платформ, включая Solaris, macOS,
Oracle Linux и BSD. DTrace может отслеживать поведение
операционной системы и запущенных пользовательских
приложений. Он может показывать значения параметров и
используется для вывода статистики производительности.
Зонды отслеживаются пользовательскими скриптами,
написанными на скриптовом языке DTrace D. Это позволяет
эффективно анализировать срезы данных.
Зонды PHP, которые не отслеживаются пользовательскими
DTrace D скриптами, не содержат никакого дополнительного
кода и, следовательно, во время нормальной работы
приложения, никакой деградации производительности не
происходит. Отслеживаемые зонды, в свою очередь,
дают очень низкую просадку производительности, что
позволяет использовать их в промышленных средах.
PHP включает в себя зонды "Статически определённой
трассировки уровня пользователя" (User-level Statically
Defined Tracing, или USDT), которые работают во время
исполнения. К примеру, когда D-скрипт отслеживает зонд
function-entry, то каждый раз при вызове
функции, этот зонд запускает соответствующее действие
D-скрипта. Это действие, например, печатает аргументы
зонда, такие как расположение этой функции в PHP-скрипте.
Или же это может быть агрегация данных, таких как
количество запусков каждой из функции.
Здесь описываются только зонды PHP USDT. Для получения
информации о том, как следить за произвольными функциями
и отслеживать поведение операционной системы, читайте
соответствующую литературу, специфичную для каждой
операционной системы и внешнюю полноценную
документацию DTrace. Обратите внимание, что различные
реализации DTrace могут отличаться набором доступного
функционала.
Статические зонды DTrace в PHP, также могут быть
использованы с SystemTap в некоторых дистрибутивах Linux.
Использование PHP и DTrace
PHP может быть сконфигурирован со статическими зондами
DTrace на платформах поддерживающих динамическую
трассировку DTrace.
Конфигурирование PHP со статическими зондами DTrace
Обратитесь к документации вашей платформы, чтобы
включить поддержку DTrace в вашей операционной системе.
К примеру, в Oracle Linux необходимо загрузить ядро UEK3
и сделать следующее:
Вместо chmod, вы можете использовать
пакет правил ACL для ограничения доступа для конкретного
пользователя.
Сборка PHP с ключом --enable-dtrace:
Это включит статические зонды в ядре PHP. Любой
модуль PHP, предоставляющий собственные зонды,
должен быть собран отдельно как разделяемый модуль.
Статические зонды DTrace в ядре PHP
Следующие статические зонды доступны в PHPИмя зондаОписание зондаАргументы зондаrequest-startupСрабатывает при начале запроса.char *file, char *request_uri, char *request_methodrequest-shutdownСрабатывает при окончании запроса.char *file, char *request_uri, char *request_methodcompile-file-entryСрабатывает, когда начинается компиляция скрипта.char *compile_file, char *compile_file_translatedcompile-file-returnСрабатывает, когда заканчивается компиляция скрипта.char *compile_file, char *compile_file_translatedexecute-entryСрабатывает, когда запускается массив байт-кода. К примеру, когда вызываются функции, возобновляется работа генератора или происходит include.char *request_file, int linenoexecute-returnСрабатывает, после отработки массива байт-кода.char *request_file, int linenofunction-entryСрабатывает, когда движок PHP начинает запуск функции или метода.char *function_name, char *request_file, int lineno, char *classname, char *scopefunction-returnСрабатывает, когда движок PHP возвращается из функции или метода.char *function_name, char *request_file, int lineno, char *classname, char *scopeexception-thrownСрабатывает, когда выброшено исключение.char *classnameexception-caughtСрабатывает, когда исключение поймано.char *classnameerrorСрабатывает если произошла ошибка, вне зависимости от уровня error_reporting.char *errormsg, char *request_file, int lineno
Модули PHP могут содержать дополнительные зонды.
Список статических зондов DTrace в PHP
Для получения списка зондов, запустите процесс PHP и выполните:
Вывод будет примерно такой:
Колонка Provider содержит надпись php и
pid текущего запущенного процесса PHP.
Если запущен веб-сервер Apache, имя модуля может быть,
например, libphp5.so, и может быть
множество блоков списка, по одному на каждый процесс Apache.
Колонка Function ссылается на имя внутренней С-функции PHP,
реализующей соответствующий зонд.
Если PHP не запущен, то связанных с ним зондов в списке не будет.
Примеры использования DTrace с PHP
Этот пример показывает базовые возможности скриптового языка DTrace D.
all_probes.d - трассировка всех статических зондов PHP с помощью DTrace
Этот скрипт использует опцию -Z для
dtrace, позволяя ему работать даже
если ни одного процесса PHP не запущено. Если не использовать
эту опцию, то скрипт сразу же завершит выполнения, поскольку
не увидит ни одного зонда, который ему надо отслеживать.
Скрипт отслеживает все статические зонды PHP на всем
протяжении работы PHP-скрипта.
Запускаем D-скрипт:
Запустите скрипт или приложение PHP. Отслеживающий D-скрипт
будет выводить аргументы всех сработавших зондов.
Когда вы увидели все, что хотели, прервать работу скрипта
можно комбинацией CTRLC.
На многопроцессорных машинах, порядок зондов может быть не
последовательным, в зависимости от того, на каких процессорах
работают зонды и как мигрируют потоки между процессорами.
Отображение временных меток позволит избежать конфузов.
К примеру:
&reftitle.seealso;
OCI8 и динамическая трассировка DTraceИспользование SystemTap со статическими зондами PHP DTrace
В некоторых дистрибутивах Linux, можно использовать утилиту
трассировки SystemTap для отслеживания статических зондов
DTrace. Данный вариант доступен в PHP 5.4.20 и PHP 5.5.
Установка PHP с SystemTap
Установите разработческий пакет SystemTap SDT:
Установите PHP с DTrace:
Получение списка статических зондов с помощью SystemTap
Статические зонды PHP можно посмотреть используя stap:
Примерный вывод:
Пример использования SystemTap с PHPall_probes.stp - трассировка всех статических зондов PHP
Приведённый выше скрипт будет выводить данные статических
зондов PHP на всем протяжении работы PHP-скрипта: