Viernes Tecnicos DTrace

1,015 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,015
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
15
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Viernes Tecnicos DTrace

  1. 1. <ul><li>José Juan Mora Pérez </li></ul><ul><li>http://es.opensolaris.org </li></ul>USE IMPROVE EVANGELIZE OpenSolaris DTrace
  2. 2. Bienvenidos a las charlas de la comunidad OpenSolaris Hispano http://es.opensolaris.org/ViernesTec/
  3. 3. DTrace
  4. 4. <ul><li>¿Qué es DTrace? </li></ul><ul><li>Lenguaje D </li></ul><ul><li>Agregaciones </li></ul><ul><li>dtrace(1M)‏ </li></ul><ul><li>Providers </li></ul><ul><li>Integrar Dtrace en las aplicaciones </li></ul><ul><li>Dtrace GUI - chime </li></ul>DTrace
  5. 5. ¿Qué es DTrace? <ul><li>Es una herramienta de instrumentación desarrollada por Sun en el 2005 y disponible en Solaris 10. </li></ul><ul><li>“ Instrumentación industrial: es el grupo de elementos que sirven para medir, convertir, transmitir, controlar o registrar variables de un proceso con el fin de optimizar los recursos utilizados en éste. ” ( es.wikipedia.org) </li></ul><ul><li>Está orientada tanto para desarrolladores como para administradores. </li></ul><ul><li>Nos permite analizar el comportamiento de nuestro sistema en caliente sin generar una perdida de rendimiento. </li></ul><ul><li>Podemos utilizar DTrace en nuestros sistemas de producción con la seguridad de que no afectará al rendimiento. </li></ul><ul><li>No consiste en estádisticas del sistema al estilo de kstat </li></ul>
  6. 6. ¿Qué es DTrace?
  7. 7. Lenguaje D <ul><li>Es una mezcla entre C y awk </li></ul><ul><li>No dispone de instrucciones para el control de flujo. </li></ul><ul><li>Los programas son compilados con el comando dtrace , de una forma parecida a como se hace en Java, una vez probado que no contiene errores es enviado a Kernel para que lo ejecute Dtrace. </li></ul><ul><li>La estructura básica de un programa en D es: </li></ul><ul><li>Descripción de la sonda </li></ul><ul><li>/ predicado / </li></ul><ul><li>{ </li></ul><ul><li>Acciones; </li></ul><ul><li>} </li></ul>
  8. 8. Lenguaje D <ul><li>Sondas (probes) y proveedores (providers)‏ </li></ul><ul><li>Debemos especificar al menos la descripción de una sonda </li></ul><ul><li>provider:module:function:name </li></ul><ul><li>Provider , es el módulo de Dtrace que publica una sonda. </li></ul><ul><li>Module , las distintas sondas de un provider pueden estar organizadas en módulos. </li></ul><ul><li>Function , es la función sobre la que actuará la sonda. </li></ul><ul><li>Name , es una descripción de qué hace la sonda. </li></ul>
  9. 9. Lenguaje D <ul><li>La única forma de controlar el flujo de un programa en D es mediante los predicados . </li></ul><ul><li>Son expresiones encerradas en / / y se evaluan como verdaderas o falsas. </li></ul><ul><li>Ejemplo: </li></ul><ul><li>/ pid == 78 / El PID es igual a 78 </li></ul><ul><li>/ execname == &quot;bash&quot;/ El nombre del programa sea bash </li></ul><ul><li>/ x <= 1 / El valor de la variable x sea menor o igual a 1 </li></ul>
  10. 10. Lenguaje D <ul><li>Disponemos de una serie de funciones que podemos utilizar para definir el comportamiento de nuestra sonda. </li></ul><ul><li>trace , toma una exprecion y la pasa directamente al buffer. </li></ul><ul><li>printf , nos permite formatear una salida. </li></ul><ul><li>stack , almacena el stack. </li></ul><ul><li>stop , para el proceso. </li></ul><ul><li>system , ejecuta un programa. </li></ul><ul><li>panic , genera un kernel panic. </li></ul><ul><li>exit , termina la ejecución de la sonda. </li></ul>
  11. 11. Lenguaje D <ul><li>Existen una serie de variables definidas que podemos utilizar: </li></ul><ul><li>pid , ID del proceso. </li></ul><ul><li>tid , ID del thread. </li></ul><ul><li>timestamp , el tiempo en nanosegundos desde el arranque de la máquina. </li></ul><ul><li>execname , nombre del proceso. </li></ul><ul><li>arg0-argN , argumento de las funciones. </li></ul><ul><li>probefunc , es el 3 campo del nombre de la sonda, normalmente el nombre de la función. </li></ul><ul><li>probename , es el 4 campo de la definición de la sonda. </li></ul>
  12. 12. DTrace Ejemplo 1: <ul><ul><li>dtrace:::BEGIN </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>trace(“Hola mundo”); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>dtrace:::END </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>trace(“Adios!!”); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>bash-3.2# dtrace -s ./hola.d </li></ul></ul><ul><ul><li>dtrace: script './hola.d' matched 2 probes </li></ul></ul><ul><ul><li>CPU ID FUNCTION:NAME </li></ul></ul><ul><ul><li>0 1 :BEGIN Hola mundo </li></ul></ul><ul><ul><li>^C </li></ul></ul><ul><ul><li>0 2 :END Adios!! </li></ul></ul>
  13. 13. DTrace Ejemplo 2: <ul><ul><li>syscall:::entry </li></ul></ul><ul><ul><li>/ pid == $1 / </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>printf(&quot;%s (%d, 0x%x, %4d) &quot;,probefunc,arg0,arg1,arg2); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>bash-3.2# dtrace -q -s ./ejemplo2.d 1046 </li></ul></ul><ul><ul><li>pollsys (134509504, 0x1, 134509672)‏ </li></ul></ul><ul><ul><li>gtime (1203163434, 0x4fa7e748, 1336403752)‏ </li></ul></ul><ul><ul><li>write (3, 0x80b36e8, 8)‏ </li></ul></ul><ul><ul><li>read (3, 0x8047600, 32)‏ </li></ul></ul><ul><ul><li>pollsys (134509568, 0x1, 0)‏ </li></ul></ul><ul><ul><li>read (3, 0x8047600, 32)‏ </li></ul></ul><ul><ul><li>gtime (1203163434, 0x4fa7e748, 1336403752)‏ </li></ul></ul><ul><ul><li>gtime (1203163434, 0x4fa7e748, 1336403752)‏ </li></ul></ul><ul><ul><li>read (3, 0x80af6e0, 32)‏ </li></ul></ul><ul><ul><li>^C </li></ul></ul>
  14. 14. DTrace Ejemplo 3: <ul><ul><li>syscall:::entry </li></ul></ul><ul><ul><li>/ pid == $1 / </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>array_sc[probefunc] = timestamp; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>syscall:::return </li></ul></ul><ul><ul><li>/ pid == $1 / </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>printf(&quot;time %d %s (%d, 0x%x, %4d) &quot;,timestamp-array_sc[probefunc], probefunc, arg0, arg1, arg2); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>bash-3.2# dtrace -q -s ./ejemplo3.d 1046 </li></ul></ul><ul><ul><li>time 10687 pollsys (0, 0x0, 0) </li></ul></ul><ul><ul><li>time 2847 gtime (1203190270, 0x47b739fe, 0) </li></ul></ul><ul><ul><li>time 18121 write (8, 0x8, 0) </li></ul></ul><ul><ul><li>time 5630 read (-1, 0xffffffffffffffff, 4294967295) </li></ul></ul><ul><ul><li>time 59836 pollsys (1, 0x1, 0) </li></ul></ul><ul><ul><li>time 2045 ioctl (0, 0x0, 0) </li></ul></ul><ul><ul><li>time 1173 ioctl (0, 0x0, 0) </li></ul></ul><ul><ul><li>^C </li></ul></ul>
  15. 15. Agregaciones <ul><li>Disponemos de una serie de funciones de agregación, que nos ayudarán a analizar los datos obtenidos tras el lanzamiento de una sonda. </li></ul><ul><li>count() , cuenta el número de veces. </li></ul><ul><li>avg() , realiza una media de los datos. </li></ul><ul><li>min() , obtiene el valor mínimo. </li></ul><ul><li>max() , obtiene el valor máximo. </li></ul><ul><li>lquantize() , distribución de frecuencia lineal. </li></ul><ul><li>quantize() , distribución de frecuencia de potencia de 2. </li></ul>
  16. 16. DTrace Ejemplo 4: <ul><ul><li>syscall:::entry </li></ul></ul><ul><ul><li>/ pid == $1 / </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>@array_sc_count[probefunc] = count(); </li></ul></ul><ul><ul><li>array_sc[probefunc] = timestamp; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>syscall::read:entry </li></ul></ul><ul><ul><li>/ pid == $1 / </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>@array_time_lq[probefunc]=lquantize(arg0,0,100,1); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>syscall::read:return </li></ul></ul><ul><ul><li>/ pid == $1 / </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>@array_time_q[probefunc]=quantize(timestamp-array_sc[probefunc]); </li></ul></ul><ul><ul><li>} </li></ul></ul>
  17. 17. DTrace Ejemplo 4: <ul><ul><li>bash-3.2# dtrace -q -s ./ejemplo4.d 576 </li></ul></ul><ul><ul><li>lwp_sigmask 53 </li></ul></ul><ul><ul><li>setcontext 53 </li></ul></ul><ul><ul><li>setitimer 107 </li></ul></ul><ul><ul><li>writev 131 </li></ul></ul><ul><ul><li>pollsys 295 </li></ul></ul><ul><ul><li>read 371 </li></ul></ul><ul><ul><li>clock_gettime 521 </li></ul></ul><ul><ul><li>read </li></ul></ul><ul><ul><li>value ------------- Distribution ------------- count </li></ul></ul><ul><ul><li>11 | 0 </li></ul></ul><ul><ul><li>12 | 2 </li></ul></ul><ul><ul><li>13 |@@@@ 37 </li></ul></ul><ul><ul><li>14 | 0 </li></ul></ul><ul><ul><li>41 |@@@@@@@@ 74 </li></ul></ul><ul><ul><li>42 | 0 </li></ul></ul><ul><ul><li>43 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 252 </li></ul></ul><ul><ul><li>44 | 0 </li></ul></ul><ul><ul><li>read </li></ul></ul><ul><ul><li>value ------------- Distribution ------------- count </li></ul></ul><ul><ul><li>512 | 0 </li></ul></ul><ul><ul><li>1024 |@@ 19 </li></ul></ul><ul><ul><li>2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 241 </li></ul></ul><ul><ul><li>4096 |@@@@@@@@@ 86 </li></ul></ul><ul><ul><li>8192 |@@ 23 </li></ul></ul><ul><ul><li>16384 | 1 </li></ul></ul><ul><ul><li>32768 | 0 </li></ul></ul>
  18. 18. dtrace(1M) <ul><ul><li>Es el programa que nos permite compilar nuestros programas en D. Dispone de una serie </li></ul></ul><ul><ul><li>de parámetros entre los que podemos destacar: </li></ul></ul><ul><ul><li>-l listado de todos los probes disponibles. </li></ul></ul><ul><ul><li>-s compila un programa en D </li></ul></ul><ul><ul><li>-P lista los probes de un provider específico </li></ul></ul><ul><ul><li>-32/64 compila los programas D en 32 o 64 bits. </li></ul></ul><ul><ul><li>-G genera un fichero ELF que podemos usar para linkar con otros programas. </li></ul></ul><ul><ul><li>-n especifica el nombre de un probe. </li></ul></ul>
  19. 19. dtrace(1M) <ul><ul><li>bash-3.2# dtrace -l </li></ul></ul><ul><ul><li>ID PROVIDER MODULE FUNCTION NAME </li></ul></ul><ul><ul><li>1 dtrace BEGIN </li></ul></ul><ul><ul><li>2 dtrace END </li></ul></ul><ul><ul><li>3 dtrace ERROR </li></ul></ul><ul><ul><li>4 Xserver576 Xorg CloseDownClient client-disconnect </li></ul></ul><ul><ul><li>5 Xserver576 Xorg Dispatch request-done </li></ul></ul><ul><ul><li>6 Xserver576 Xorg Dispatch request-start </li></ul></ul><ul><ul><li>7 Xserver576 Xorg AddResource resource-alloc </li></ul></ul><ul><ul><li>8 Xserver576 Xorg FreeClientResources resource-free </li></ul></ul><ul><ul><li>9 Xserver576 Xorg FreeClientNeverRetainResources resource-free </li></ul></ul><ul><ul><li>10 Xserver576 Xorg FreeResourceByType resource-free </li></ul></ul><ul><ul><li>... </li></ul></ul>
  20. 20. Provider <ul><li>Las sondas (probes) son generadas por unos módulos del kernel que se denominan providers. Con el comando dtrace(1M) podemos ver la lista de providers que tiene nuestro sistema, de esta lista podemos destacar: </li></ul><ul><li>fbt (Function Boundary Tracing) nos permiten tracear la mayoría de las funciones del Kernel. Con el comando dtrace -l -P fbt podemos ver la lista de los probes disponibles. </li></ul><ul><li>lockstat , con este provider podemos tracear posibles problemas de contención en locks. </li></ul><ul><li>mib , nos da acceso a los contadores MIBs de Solaris. </li></ul><ul><li>proc , obtenemos información sobre el estado de los procesos y los threads. </li></ul><ul><li>syscall , nos permite tracear todas las llamadas a systema. </li></ul><ul><li>sysinfo , obtenemos información sobre el sistema. </li></ul><ul><li>vminfo , obtenemos información sobre el VM. </li></ul>
  21. 21. Integrar Dtrace en las aplicaciones <ul><li>Una de las cosas que hace interesante a Dtrace es que podemos crear nuestros propios providers, para que generen probes en cualquiera de nuestras aplicaciones. </li></ul><ul><li>Es una herramienta muy potente para las fases de desarrollo de SW, ya que permite de forma sencilla hacer un análisis del rendimiento de la aplicación. </li></ul><ul><li>El nuevo provider no generará nada mientras no se cree un probe que lo consulte, por lo que las aplicaciones no reducirán su rendimiento. </li></ul><ul><li>Para los administradores, es una forma sencilla de controlar el estado y rendimiento de las aplicaciones, sobre todo de aquellas de las que dispongamos el fuente. </li></ul><ul><li>Un ejemplo: </li></ul><ul><li>En cualquier SMTP de código abierto, podríamos modificar el fuente, para que nos devolviera información de cuanto tarda en procesar un mensaje o el tiempo medio que se utiliza para almacenar un mensaje en disco. </li></ul>
  22. 22. Integrar Dtrace en las aplicaciones Ejemplo 5: Cómo crear nuestro propio provider 1.- Crear un fichero con la definición del provider. <ul><ul><li>bash-3.2# cat myprovider.d </li></ul></ul><ul><ul><li>provider myprovider </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>probe op_entry(string); </li></ul></ul><ul><ul><li>probe op_return(); </li></ul></ul><ul><ul><li>}; </li></ul></ul>
  23. 23. Integrar Dtrace en las aplicaciones Ejemplo 5: Cómo crear nuestro propio provider 2.- Modificamos nuestra aplicación para que utilice los probes de nuestro provider. <ul><ul><li>bash-3.2# cat app_main.c </li></ul></ul><ul><ul><li>#include <stdio.h> </li></ul></ul><ul><ul><li>#include <sys/sdt.h> </li></ul></ul><ul><ul><li>#include <unistd.h> </li></ul></ul><ul><ul><li>main()‏ </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>int sp; </li></ul></ul><ul><ul><li>for(;;) { </li></ul></ul><ul><ul><li>DTRACE_PROBE1(myprovider,op_entry,&quot;Entrada en op&quot;); </li></ul></ul><ul><ul><li>sp=rand()%5; </li></ul></ul><ul><ul><li>printf(&quot;Inicio Op: sleep (%d) &quot;,sp); </li></ul></ul><ul><ul><li>sleep(sp); </li></ul></ul><ul><ul><li>printf(&quot;Fin Op &quot;); </li></ul></ul><ul><ul><li>DTRACE_PROBE(myprovider,op_return); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul>
  24. 24. Integrar Dtrace en las aplicaciones Ejemplo 5: Cómo crear nuestro propio provider 3.- Compilamos nuestra aplicación junto con nuestro programa en D. <ul><ul><li>bash-3.2# gcc -c app_main.c </li></ul></ul><ul><ul><li>bash-3.2# </li></ul></ul><ul><ul><li>bash-3.2# dtrace -G -s myprovider.d app_main.o </li></ul></ul><ul><ul><li>bash-3.2# </li></ul></ul><ul><ul><li>bash-3.2# gcc -o app1 myprovider.o app_main.o </li></ul></ul><ul><ul><li>bash-3.2# </li></ul></ul><ul><ul><li>bash-3.2# ./app1 </li></ul></ul><ul><ul><li>Inicio Op: sleep (3) </li></ul></ul><ul><ul><li>Fin Op </li></ul></ul><ul><ul><li>Inicio Op: sleep (3) </li></ul></ul><ul><ul><li>Inicio Op: sleep (4) </li></ul></ul><ul><ul><li>Fin Op </li></ul></ul><ul><ul><li>Inicio Op: sleep (3) </li></ul></ul><ul><ul><li>Fin Op </li></ul></ul><ul><ul><li>Inicio Op: sleep (2) </li></ul></ul>
  25. 25. Integrar Dtrace en las aplicaciones Ejemplo 5: Cómo crear nuestro propio provider 4.- Creamos un script en D para poder chequear los nuevos probes en nuestra aplicación. <ul><ul><li>bash-3.2# cat app1_probe.d </li></ul></ul><ul><ul><li>myprovider$1 :::op_entry </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>ts = timestamp; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>myprovider$1:::op_return </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>printf(&quot; probename: %s time: %d ns&quot;,probename, (timestamp - ts)); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>bash-3.2# </li></ul></ul>
  26. 26. Integrar Dtrace en las aplicaciones Ejemplo 5: Cómo crear nuestro propio provider
  27. 27. Dtrace GUI - Chime Existe un GUI para Dtrace que nos permite de forma gráfica realizar un análisis de nuestro sistema. Por defecto vienen algunas sondas preparadas, pero con Chime podemos visualizar de una forma rápida nuestro propios programas D.
  28. 28. OpenSolaris Hispano Gracias!!! <ul><li>http://es.opensolaris.org </li></ul><ul><li>Lista de distribución </li></ul><ul><li>http://mail.opensolaris.org/mailman/listinfo/ug-sposug </li></ul>USE IMPROVE EVANGELIZE

×