Динамическая трассировка 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_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 и выполните: Вывод будет примерно такой: Колонка Provider содержит надпись php и pid текущего запущенного процесса PHP. Если запущен веб-сервер Apache, имя модуля может быть, например, libphp5.so, и может быть множество блоков списка, по одному на каждый процесс Apache. Колонка Function ссылается на имя внутренней С-функции PHP, реализующей соответствующий зонд. Если PHP не запущен, то связанных с ним зондов в списке не будет. Примеры использования DTrace с PHP Этот пример показывает базовые возможности скриптового языка DTrace D. <filename>all_probes.d</filename> - трассировка всех статических зондов 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 с PHP <filename>all_probes.stp</filename> - трассировка всех статических зондов PHP Приведённый выше скрипт будет выводить данные статических зондов PHP на всем протяжении работы PHP-скрипта: