Red de conocimiento informático - Material del sitio web - Cómo utilizar PHP DTrace en Oracle Linux

Cómo utilizar PHP DTrace en Oracle Linux

DTrace es una popular herramienta de seguimiento "siempre activa" que se utiliza para identificar problemas de rendimiento y comportamiento en sistemas de desarrollo y producción. El kernel "UEK3" estándar de Oracle Linux incluye soporte para DTrace. Los problemas con los scripts PHP se pueden identificar de forma eficaz mediante el seguimiento de las sondas de usuario en el núcleo PHP y las extensiones PHP OCI8. DTrace le permite rastrear las interacciones entre las aplicaciones del usuario y el sistema operativo.

En Oracle Linux, la utilidad DTrace requiere una suscripción a la red unbreakable Linux (ULN) de Oracle.

Instalar Oracle Linux y Oracle Unbreakable Enterprise Kernel versión 3.

Primero, instale Oracle Linux 6.4 a través de Oracle E-Delivery.

Después de instalar Oracle Linux 6.4, asegúrese de que la versión 3 del kernel empresarial irrompible para el último canal de Oracle Linux 6(x86_64) esté habilitada en ULN. Instale el kernel UEK3:

# yum install kernel-uek

Habilite el canal "Oracle Linux 6 DTrace User Space Tool (x86_64) -latest" en ULN e instale la utilidad DTrace:

# yum install dtrace-utils

Reinicie con el nuevo kernel UEK3 3.8.13.

Instalación de PHP

Necesita utilizar el parámetro -enable-dtrace para compilar PHP. Puede instalar algunos RPM de evaluación prediseñados con DTrace habilitado. Consulte el área de juegos "Paquetes prediseñados" de "DTrace PHP con Oracle Linux".

También puedes reconstruir PHP de la siguiente manera:

Descarga PHP 5.4.20 o PHP 5.5.4 o superior desde php.net y descomprime:

$ tar -xJf php-5.4.20.tar.bz2

$ cd php-5.4.20

Configurar PHP:

$ ./config \

- prefix=$HOME/p54 \

- enable-dtrace \

- desactivar-todos - desactivar-cgi \

-con- pear-enable-XML-enable-libxml-with-zlib

Esto creará una línea de comando PHP mínima con DTrace habilitado. Todas las extensiones innecesarias están deshabilitadas. Puede incluir otras extensiones según sea necesario.

La opción de prefijo significa instalar en un directorio local para que pueda ver fácilmente los archivos instalados. Después de usar instantáneas, es fácil limpiar el directorio.

Las opciones Pear, xml y zlib permiten comandos pecl.

Genera el binario PHP e instálalo:

$ make

$ para instalar

Copia php.ini-development a $ HOME /p54/lib/php.ini y edite el archivo para configurar la zona horaria, por ejemplo:

date.timezone=Americas/Los Angeles

Instale PHP OCI8 para la base de datos Oracle.

La versión de evaluación de PHP RPM incluye una extensión OCI8 que puede conectarse a la base de datos Oracle; consulte la publicación del blog mencionada anteriormente.

Sin embargo, si compila PHP usted mismo, deberá agregar PHP OCI8 manualmente como la extensión "* * *":

Habilite "software Oracle para Oracle Linux 6 (x86 _ 64 )” canal.

Instalar el cliente instantáneo de Oracle como usuario root:

# yum install Oracle-instant client 12.1-basic Oracle-instant client 12.1-devel

Como usuario normal, establezca la ruta a PHP:

$ export PATH = $ HOME/p54/bin:$ PATH

Si necesita acceder: 80/

Establezca el entorno variables PHP_DTrace para habilitar DTrace, luego instale PHP OCI8:

$ PHP_DTRACE = yes pecl install OCI 8-2.0.2

La sonda DTrace que se utilizará más adelante en este artículo La definición es Basado en PHP OCI8 2.0.2, por lo que es necesario instalar una versión explícita. Si desea instalar una versión posterior, verifique el detector y sus parámetros para ver si hay mejoras menores en la última versión.

Cuando se le solicite el directorio ORACLE_HOME, no es necesario ingresar texto, simplemente presione la tecla Retorno. La instalación detectará automáticamente los RPM de Oracle Instant Client. La configuración continuará y el resultado contendrá algo similar a:

[ . . ]

Verifique la compatibilidad con OCI8 de la base de datos Oracle... Sí, compartida

Verifique la versión de PHP... OK

Verifique la compatibilidad con OCI8 DTrace... Sí< / p>

[ .. . ]

Configuración: ADVERTENCIA: Extensión OCI8: ORACLE_HOME no configurada,

Buscando el cliente instantáneo de Oracle predeterminado

Verifique el directorio del cliente instantáneo de Oracle...

/usr/lib/Oracle/12.1/client 64/lib

Comprobando el directorio de encabezado del SDK de Oracle Instant Client...

/usr/include/ Oracle/12.1/ cliente 64

Comprobando la compatibilidad de la versión de la biblioteca del cliente instantáneo de Oracle...12.1

[ . . ]

Edite php.ini nuevamente y agregue PHP OCI8:

extension=oci8.so

Confirmar instalación:

$ php - ri oci8

oci8

Soporte OCI8=>habilitado

Soporte OCI8 DTrace=>habilitado

Versión OCI8=& desarrollo gt

Revisión= & gt$ Id:b 30 FB 4 bef 45d 9 F5 ce 8 a 56 b 736 f 1546 ea 0 CFF 08 ef $.

Versión de la biblioteca del cliente en tiempo de ejecución de Oracle = & gt12.1.0.1.0

Versión del cliente en tiempo de compilación de Oracle = & gt12.1

Instrucciones = & gt valor local = > valor primario

OCI 8. max_persistent = >-1 = >-1

OCI 8. persistente_time out = >- 1 = >-1

OCI 8. ping_interval = > 60 = >60

oci8.privileged_connect = >Off = >leave

oci8.statement _ cache _ size = & gt20 = >20

oci8.default_prefetch = >100 = >100

OCI 8 antiguo _ OCI _ close _ semantics = & gt;Off = & gtLeave

oci8.connection_class = >No value=>Sin valor

oci8.events = >Off = >Leave

Estadísticas = & gt

Conexiones persistentes activas = & gt0

Activas conexiones = & gt0

Instrucciones de instalación de PHP OCI8

Para admitir DTrace, es necesario instalar PHP OCI8 2.0 de PECL, ya que PHP 5.4 y PHP OCI8 1.4 incluidos en PHP 5.5 no lo hacen. tener un detector DTrace. Después del lanzamiento de PHP 5.6 en el futuro, podrá configurar PHP OCI8 que admita DTrace al compilar PHP.

Por supuesto, puede instalar PHP OCI8 a través del archivo zip de Oracle Instant Client, o simplemente puede instalarlo usando su ORACLE_HOME existente.

Puede instalar PHP OCI8 compatible con DTrace en una versión de PHP que no incluya o no esté configurada con DTrace. Esto incluye versiones anteriores de PHP. Podrá rastrear la sonda PHP OCI8, pero no la sonda PHP principal. Del mismo modo, puede instalar PHP OCI8 con DTrace deshabilitado además de PHP habilitado para DTrace.

Si usa phpize y configura en lugar de pecl para instalar PHP OCI8 2.0 de PECL, aún necesita configurar PHP_DTRACE=yes. Esto se debe a que el script de configuración limitada del paquete PECL ignorará la opción -enable-dtrace.

El script de configuración PHP OCI8 2.0 funciona con DTrace "real", pero Linux SystemTap no rastrea extensiones.

Tenga en cuenta que la salida generada por los archivos binarios optimizados de DTrace puede diferir del código que vemos.

Verificar la sonda PHP DTrace

Habilite DTrace como usuario root para permitir que los usuarios normales registren información de seguimiento:

# modprobe quick trap

# chmod 666 /dev/dtrace/helper

En lugar de usar el comando chmod, puede usar reglas del paquete ACL para restringir el acceso de usuarios específicos al dispositivo.

Ejecuta php como usuario normal, sin opciones. PHP se iniciará y esperará la entrada:

$ php

Enumere las sondas DTrace disponibles como raíz.

El detector central de PHP y el detector PHP OCI8 son los siguientes:

# dtrace -l -m php -m oci8.so

4 php9559 php dtrace_compile_file entrada de archivo compilado

5 php9559 php dtrace_compile_file compilación-archivo-retorno

6 php9559 php zend_error error

7 PHP 9559 PHP ZEND_CATCH_SPEC_CONST_CV_HANDLER excepción detectada

8 PHP 9559 PHP Zend _ throw _ excepción _ lanzamiento de excepción interna

9 php9559 php dtrace_execute_ex entrada de ejecución

10 PHP 9559 PHP dtrace _ ejecutar _ entrada de ejecución interna

11 PHP 9559 PHP dtrace_ejecutar_ex ejecución-retorno

12 PHP 9559 PHP dtrace_ejecutar_ejecución interna-retorno

13 PHP 9559 PHP dtrace_ejecutar_ex función - entrada

14 PHP 9559 PHP dtrace _ ejecutar _ ex función - regresar

15 PHP 9559 PHP _ solicitud _ cerrar solicitud de apagado

16 PHP 9559 PHP_request_startup solicitud para iniciar

p>

17 PHP 9559 OCI 8. so PHP_OCI_dtrace_check_connection OCI 8-check-connection

18 PHP 9559 OCI 8. so PHP_OCI_do_connect OCI 8-connect-entry

19 PHP 9559 OCI 8. entonces PHP_OCI_persistent_helper OCI 8-connect-expiry

20 PHP 9559 OCI 8. entonces PHP_OCI_do_connect_ex OCI 8-connect-lookup

21 PHP 9559 OCI 8. entonces PHP_OCI_p connect_list_NP_ dtor OCI 8-connect-p-dtor-close

22 PHP 9559 OCI 8. entonces PHP _ OCI _ p conexión _ lista _ NP _ dtor OCI 8-connect-p-dtor-release

23 PHP 9559 OCI 8. entonces PHP_OCI_do_connect OCI 8-connect-return

24 PHP 9559 OCI 8. entonces PHP_OCI_do_connect_ex OCI 8- tipo de conexión

25 PHP 9559 OCI 8. entonces PHP_OCI_error OCI 8-error

26 PHP 9559 OCI 8. entonces PHP_OCI_statement_exec

ute OCI 8-modo de ejecución

27 PHP 9559 OCI 8 . Entonces PHP _ OCI _ create _ spool OCI 8-sess pool-create

28 PHP 9559 OCI 8 . OCI _ create _ session OCI 8-sess pool-stats

29 PHP 9559 OCI 8 , entonces PHP _ OCI _ create _ session OCI 8-sess pool-type

30 PHP 9559 OCI 8.so PHP_OCI_statement_create OCI 8-SQL text

Las sondas principales de PHP se detallan en el manual de PHP. El detector PHP OCI8 se describe a continuación.

En la terminal de usuario, use Ctrl-C para detener el archivo ejecutable php.

$ php

C

$

Descripción general del detector PHP OCI8 2.0 DTrace

Sondas PHP estáticas OCI8 2.0 Se puede dividir en sondas de "usuario" y sondas de "mantenedor". Este último es más útil para que los mantenedores de PHP OCI8 verifiquen la funcionalidad durante el desarrollo de la extensión. Todos los detectores devuelven datos como parámetros. La documentación oficial detalla el detector PHP OCI8 DTrace.

En OCI8 2.0.2, los detectores de usuario incluyen:

OCI 8-connect-entry - iniciado por oci_connect() y oci_new_connect(). Se dispara antes de que se establezca una conexión a la base de datos.

char * nombre de usuario-Nombre de usuario de conexión.

char * cadena de conexión nombrebd-base de datos.

char * charset: el conjunto de caracteres especificado.

Modo de sesión larga: OCI_SYSDBA (0x2), OCI_SYSOPER (0x4) y OCI_CRED_ext (1

int persistente: establecido en si oci_pconnect() se llama 1; de lo contrario, establecido en 0.

exclusivo de intex: se establece en 1 si se llama a oci_new_connect(); de lo contrario, se establece en 0.

OCI 8-connect-return: se activa cuando <. /p>

conexión nula *: la dirección de la estructura de conexión

OCI 8-comprobar-conexión-Iniciar cuando un error de Oracle puede provocar que la conexión falle. conexión void *: la dirección de la estructura de conexión

Int is_open - 0 si errcode o server_status indica que la conexión no es válida y debe volver a crearse

Código de error largo: error de Oracle. número

indicador de biblioteca server_status-Oracle largo sin firmar, que indica si la conexión no es válida. Si is_open es 0 porque el código de error indica que la conexión no es válida, server_status tiene su valor predeterminado de 1. >OCI 8-SQL. text-Inicio al ejecutar oci_parse().

void * conexión-La dirección de la estructura de conexión

Char * sql-El texto de la instrucción SQL ejecutada /p><. p>OCI 8-error-Iniciar cuando ocurre un error de Oracle.

Estado int: Oracle devuelve el estado de la llamada fallida a la biblioteca de Oracle. Por ejemplo, -1 indica el error de OCI de Oracle y 1 indica la información de éxito de OCI de Oracle. Consulte oci.h de Oracle para conocer todas las definiciones.

Código de error largo: número de error de Oracle.

OCI 8-execute-mode: indica el estado de envío de la llamada oci_execute().

conexión nula *: la dirección de la estructura de conexión.

Modo entero sin signo: el modo pasado a la biblioteca de Oracle, como OCI_NO_AUTO_COMMIT (0x00), OCI_DESCRIPTION_UNIQUE (0x10) u OCI_COMMIT_SUCCESS (0x20).

Nota: El último OCI8 2.0.6 incluye la sonda oci8-connection-close, y varias sondas ahora también tienen parámetros client_id y punteros a estructuras de oraciones.

A continuación se muestra el detector de mantenedor. Consulte el código fuente PHP OCI8 para obtener una descripción de los parámetros.

OCI 8-conectar-p-dtor-cerrar

void *connect

OCI 8-conectar-p-dtor-liberar

void *conexión

OCI 8-conexión-buscar

void *conexión

int is_stub

OCI 8-conexión-expire

conexión *void

int is_stub

long idle_expire

marca de tiempo prolongada

OCI 8 - tipo de conexión

int persistente

int exclusivo

void *conexión

long number_persistent

long Número de conexiones\

Creación de grupo de 8 sesiones de OCI

void *session_pool

Estadísticas del grupo de 8 sesiones de OCI

sin firmar, largo y libre

ocupado durante mucho tiempo sin firmar

abierto durante mucho tiempo sin firmar

Tipo de grupo de 8 sesiones OCI

tipo int

void *session_pool

La sonda en PHP OCI8 2.0 reemplaza la traza oci_internal_debug() utilizada en PHP OCI8 1.4. Esta función se ha convertido en una instrucción vacía y no hace nada.

Usa PHP OCI8 y DTrace

Realiza los siguientes pasos.

Crea un archivo PHP simple oci8.php para consultar la base de datos:

& lt? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)

Informe de errores (0

ini_set('display_errors ', ' Off '); Función do_query($c,$sql)

{

$s = oci_parse($c,$SQL);

if (!$)

Retorno;

$ r = OCI _ ejecutar($ s);

Si (!$r)

Retorno;

mientras(($ fila = OCI _ fetch _ fila $ s))! = false) {

foreach ($fila como $elemento) {

echo $elemento.

" ";

}

Echo "\n";

}

}

$c = oci_new_connect('hr ', ' bienvenido ', ' localhost/pdborcl ');

do_query($c, "de rownum & lt5 factorial 1");

do_query($ c , "Seleccione algo de Does_not_exist");

? & gt

Cree un script publicitario user_oci8.d para detectar la ejecución de oci8.php:

#!/usr/sbin/dtrace -Zs

# Esto El script es adecuado para OCI8 2.0.2

php*:::oci8-connect-entry

{

printf("PHP Connection-entry\n" );

printf("\tNombre de usuario %s\n ", arg0? copiar instr(arg 0):" ");

printf("\tNombre de base de datos % s\ n ", arg1? copiar instr(arg 1):" ");

printf("\t charset %s\n ", arg2? copiar instr(arg 2):" ");

printf("\t session_mode %ld\n ", (long)arg 3

printf("\t persistente %d\n ", (int)arg 4);

printf("\t exclusivo %d\n ", (int)arg 5);

}

php*:::oci8- connect- return

{

printf(" PHP OCI 8-connect-return \ n ");

printf("\tConnect 0x%p\ n ", (void *)arg 0);

}

PHP *:::OCI 8-Conexión-Cerrar

{

printf (" PHP OCI 8-connect-close \ n ");

printf("\tconnect 0x%p\n ", (void *)arg 0); /p>

PHP *:::OCI 8-error

{

printf(" PHP OCI 8-error \ n ");

printf("\t estado %d\n ", (int)arg 0);

printf("\t errorcode %ld\n ", (long)arg 1);

}

PHP *:::OCI 8-comprobar-conexión

{

printf(" PHP OCI 8-comprobar-conexión \ n ") ;

printf("\tConexión 0x%p\n ", (void *)arg 0);

printf("\t is_open %d\n ", arg 1) ;

printf("\t errorcode %ld\n ", (largo)arg 2);

printf("\t server_status %lu\n ", (sin firmar largo) arg 3);

}

php*:::oci8-sqltext

{

printf(" PHP OCI 8-SQL texto \n ");<

/p>

printf("\tconexión 0x%p\n ", (void *)arg 0);

printf("\t sql %s\n ", arg0? copiar instr ( arg 1):" ");

}

php*:::oci8-execute-mode

{

printf ( " PHP OCI 8-modo de ejecución \ n ");

printf("\tConnection 0x%p\n ", (void *)arg 0); \tMode 0x%x\n ", arg 1);

}

Utilizando OCI8 2.0.6, los valores de algunos parámetros deben ajustarse para cumplir con los requisitos de Se necesitan algunos parámetros nuevos.

Inicie el script d como usuario root. El script se detendrá hasta que se active el detector:

# chmod +x user_oci8.d

# ./user_oci8.d

(Después de experimentar PHP, puede Utilice Ctrl-C para cerrar esta terminal. )

Ejecute la línea de comando PHP en otra ventana.

Mostrar entrada para una consulta exitosa:

$ PHP oci8.php

Pekín

Berna

El nombre original de MUMBAI

Ginebra

En el terminal raíz que ejecuta el script d, se mostrarán las sondas activadas durante la ejecución de PHP:

# ./user_oci8.d

dtrace :Script "user_oci8.d" coincidió con 0 sondas

Función de ID de CPU:nombre

1 18 PHP_OCI_do_connect:OCI 8-connect-entry

p>

Nombre de usuario hr

dbname localhost/pdborcl

Conjunto de caracteres

Modo de sesión 0

Persistente 0

Exclusivo 0

0 23 PHP_OCI_do_conectar:OCI 8-conectar-retorno PHP OCI 8-conectar-retorno

Conectar 0x7f64e112cff0

0 31 PHP_OCI _ declaración _ crear:Texto OCI 8-SQL PHP Texto OCI 8-SQL

Conexión 0x7f64e112cff0

SQL ordenado por 1 desde rownum & lt5

0 27 PHP _ OCI _ declaración _ ejecutar: OCI 8-modo de ejecución PHP OCI 8-modo de ejecución

Conexión 0x7f64e112cff0

Modo 0x20

0 31 PHP _ OCI _ declaración _ crear:Texto OCI 8-SQL Texto PHP OCI 8-SQL

Conexión 0x7f64e112cff0

sql selecciona algo de lo que no existe

0 27 Declaración PHP _ OCI _ _ ejecutar:OCI 8-modo de ejecución PHP OCI 8-modo de ejecución

Conexión 0x7f64e112cff0

Modo 0x20

0 26 PHP_OCI_error:OCI 8-Error PHP OCI 8 -Error

Estado-1

Código de error 942

0 17 PHP_OCI_dtrace_ check_connection:OCI 8-check-connect PHP OCI 8-check-connect

Conexión 0x7f64e112cff0

is_open 1

Código de error 942

server_status 1

0 25 PHP _ OCI _ conexión _ cerrar :OCI 8-connection-close PHP OCI 8-connection-close

Conexión 0x7f64e112cff0

(Agregar -q al parámetro /usr/sbin/dtrace de user_oci8.d ocultará el Detalles de CPU e ID. )

En máquinas con varias CPU, es posible que las sondas no aparezcan en orden, dependiendo de qué CPU las esté procesando.

Mostrar la marca de tiempo de la sonda ayudará a eliminar la confusión, por ejemplo:

php*:::oci8-connect-entry

{

printf(" PHP connect - entrada en % lld \n ", marca de tiempo del muro);

}

Desde la salida de user_oci8.d DTrace, puede ver lo siguiente:

Conexión iniciado (oci8-connect-entry). El usuario hr se conecta a la base de datos localhost/pdborcl. Debido a que exclusivo y persistente son ambos 0, esta es una llamada a oci_connect(). No se solicita ningún juego de caracteres explícito. Solicite el modo de sesión predeterminado (el quinto parámetro opcional de oci_connect).

Se analizan dos sentencias SQL (oci8-sqltext) y se ejecutan en modo 0x20 (oci-execute-mode).

Se generó el error de Oracle -ORA-942 (la tabla o vista no existe) (OCI 8-Error).

Este error hace que se verifique el estado de la conexión (oci8-check-connection). El valor de is_open es 1, lo que indica que la conexión es normal.

Con esta información, puede realizar un seguimiento de la ejecución de sentencias problemáticas y de los problemas de conexión.

Resumen

DTrace es una utilidad muy poderosa. Este artículo solo presenta brevemente su uso. Con el ejemplo anterior, el rastreo PHP OCI8 se puede integrar con el rastreo PHP principal. Puede configurar el tiempo de llamada de las funciones PHP y contar el número de llamadas. Puede obtener más información sobre las llamadas al sistema operativo realizadas por PHP. Bryan Cantrill ha publicado algunos ejemplos básicos de seguimiento de PHP en DTrace y PHP (demostración). (Tenga en cuenta que la actualización de la plataforma del blog provocó que una barra invertida apareciera como dos barras invertidas en sus publicaciones de blog. Además, ya no necesita una extensión PHP DTrace separada. El kit de herramientas DTrace de Brendan Gregg contiene muchos scripts DTrace útiles. También hay varios tipos de blog.

Recuerde, DTrace está diseñado para tener su funcionalidad siempre habilitada, adecuada para desarrollo y producción (el proceso donde DTrace es más necesario) para tener cero gastos generales cuando no monitorea los detectores.