Rastreo Dinámico con DTrace Introducción a PHP y DTrace DTrace es un marco de rastreo de disponibilidad permanente, bajo consumo, y disponible en un gran número de plataformas incluyendo Solaris, Mac OS X, Oracle Linux y BSD. DTrace puede seguir el rastro del comportamiento del sistema operativo y la ejecución del programa del usuario. DTrace puede enseñar los valores de los argumentos y ser utilizados para inferir estadísticas de rendimiento. Los sondeos son monitorizados por scripts creados por el usuario, escritos en el programa de scripting DTrace D. Esto permite el análisis eficiente de puntos de datos. Los sondeos en PHP que no son activamente monitorizados por scripts DTrace D del usuario no contienen código observado por lo cual no hay una degradación del rendimiento durante la ejecución normal de la aplicación. Los sondeos que estan siendo monitorizados incurren una perdida suficientemente baja para permitir monitorización con DTrace en entornos de producción activos. PHP incorpora sondeos "User-level Statically Defined Tracing" (USDT) que son evaluados en tiempo de ejecución. Por ejemplo, cuando un script D está monitorizando una entrada de función, cada ve que la función de PHP es llamada, dispararía el sondeo y el código de acción que ésta tiene asociado. Esta código de acción podría, por ejemplo, imprimir los argumentos del sondeo tales como lo ubicación del fichero con la función PHP, o podría contabilizar el número de veces que esta función fue llamada. Sólo sondas PHP USDT son descritas aquí. Refierase a documentación externa sobre DTrace de sistema operativo para ver como puede DTrace ser usado para rastrear funciones arbitrarias, y como puede ser usado para rastrear el comportamiento del sistema operativo. Tenga en cuenta que no todas las funcionalidades de DTrace estan disponibles en todas las implementaciones de DTrace. Las sondas estáticas de DTrace están incluidas en PHP 5.4. Previo a esto estaba incluidas via una extensión PECL, que ahora ha quedado obsoleta. Las sondas estáticas DTrace en PHP pueden alternativamente ser usadas con las herramientas de SystemTap en algunas distribuciones Linux. Usando PHP y DTrace PHP puede ser configurado con sondas estáticas DTrace en plataformas que soportan Rastreo Dinámico DTrace. Configurando PHP para Sondas Estáticas DTrace Refierase a la documentación externa específica par su plataforma para habilitar el soporte para rastreo DTrace en el sistema operativo. Por ejemplo, en Oracle Linux arranque con un kernel UEK3 y haga: En lugar de utilizar chmod, usted podria utilizar una regla de paquete ACL para limitar acceso a los dispositivos a ciertos usuarios. Compile PHP con el parámetro de configuración --enable-dtrace: Esto habilita las sondas estáticas en el núcleo de PHP. Cualquiera de las extensiones que ofrezcan sus propios sondeos deberán ser compiladas de forma separada como extensiones compartidas. Sondeos Estáticos DTrace en el núcleo de PHP Los siguientes sondeos estáticos están disponibles en PHP Nombre del Sondeo Descripción del Sondeo Argumentos del Sondeo request-startup Se dispara cuando comienza una petición. char *file, char *request_uri, char *request_method request-shutdown Se dispara cuando se termina una petición. char *file, char *request_uri, char *request_method compile-file-entry Se dispara cuando la compilación de un script comienza. char *compile_file, char *compile_file_translated compile-file-return Se dispara cuando la compilación de un script termina. char *compile_file, char *compile_file_translated execute-entry Se dispara cuando un código de operación array está por ser ejecutado. Por ejemplo, se dispara en llamadas a funciones, includes, y continuaciones de resumes. char *request_file, int lineno execute-return Se dispara después de la ejecución de un código de operación array. char *request_file, int lineno function-entry Se dispara cuando el motor de PHP entra a la llamada de una función o método. char *function_name, char *request_file, int lineno, char *classname, char *scope function-return Se dispara cuando el motor de PHP regresa de la llamada a una función o método. char *function_name, char *request_file, int lineno, char *classname, char *scope exception-thrown Se dispara cuando una excepción es lanzada. char *classname exception-caught Se dispara cuando una excepción es capturada. char *classname error Se dispara cuando ocurre un error, sin importar el nivel de error_reporting. char *errormsg, char *request_file, int lineno
Otras extensiones PHP pueden también tener otras sondas estáticas adicionales.
Listando Sondas Estáticas DTrace en PHP Para listar todas las sondas disponibles, inicie un proceso PHP y ejecute: La salida será similar a: La columna Proveedor consiste en php y el id del proceso del proceso PHP que está ejecutandose. Si el servidor web Apache está corriendo, el nombre del módulo será, por ejemplo, libphp5.so, y habría múltiples bloques de listado, uno por cada proceso Apache ejecutandose. La columna Función se refiere los nombres internos de función de su implementación en C, donde cada proveedor está ubicado. Si un proceso PHP no está ejecutandose, entonces ningún sondeo será mostrado. DTrace con un ejemplo PHP Este ejemplo muestra los conceptos básicos del lenguaje de scripting DTrace D. <filename>all_probes.d</filename> para monitorizar todos los Śondeos Estáticos en PHP con DTrace Este script utiliza la opción -Z en dtrace, permitiendo que se ejecute aún cuando no hay procesos PHP ejecutandose. Si esta opción se hubiese omitido el script hubiese terminado inmediatamente porque no sabría que los sondeos a ser monitorizados realmente son válidos. Este script rastrea todas las sondas estáticas del núcleo de PHP y puntos de muestreo a lo largo de la duración de un script PHP que esté corriendo: Ejecuta un script o aplicación PHP. El script D de monitorización mostrará los argumentos de cada sondeo según vayan sucediendo. Cuando la monitorización está completada, el script D puede ser terminado con ^C. En máquinas con múltiples-CPU el orden de los sondeos podría no aparecer secuencialmente. Esto depende de en que CPU fue procesado, y como los hilos se mueven a través de las CPUs. Mostrar la fecha y hora del sondeo ayudará a reducir la confusión, por ejemplo: Vea también OCI8 y Rastreo Dinámico DTrace
Usando SystemTap con Sondas Estáticas en PHP DTrace En algunas distribuciones Linux, la utilidad de rastreo SystemTap puede ser usada para rastrear sondas estáticas en PHP. Esto está disponible con PHP 5.4.20 y PHP 5.5. Instalando PHP con SystemTap Instalar el paquete de desarrollo SD de SystemTap: Instalar PHP con los sondeos de DTrace habilitados: Listando Sondeos Estáticos con SystemTap Los sondeos estáticos en PHP pueden ser listados usando stap: Esto produce la salida: SystemTap con un ejemplo PHP <filename>all_probes.stp</filename> para monitorizar todas los Sondeos Estáticos de PHP con SystemTap El script anterior rastreará todas las sondas estáticas del núcleo de PHP y puntos de muestreo a lo largo de la duración de un script PHP que esté corriendo: