Rastreo Dinámico con DTraceIntroducció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 PHPNombre del SondeoDescripción del SondeoArgumentos del Sondeorequest-startupSe dispara cuando comienza una petición.char *file, char *request_uri, char *request_methodrequest-shutdownSe dispara cuando se termina una petición.char *file, char *request_uri, char *request_methodcompile-file-entrySe dispara cuando la compilación de un script comienza.char *compile_file, char *compile_file_translatedcompile-file-returnSe dispara cuando la compilación de un script termina.char *compile_file, char *compile_file_translatedexecute-entrySe 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 linenoexecute-returnSe dispara después de la ejecución de un código de operación array.char *request_file, int linenofunction-entrySe 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 *scopefunction-returnSe 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 *scopeexception-thrownSe dispara cuando una excepción es lanzada.char *classnameexception-caughtSe dispara cuando una excepción es capturada.char *classnameerrorSe 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.
all_probes.d 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énOCI8 y Rastreo Dinámico DTraceUsando 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 PHPall_probes.stp 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: