1. Introducción a DTrace Iban Nieto Castillero Comunidad OpenSolaris OpenJavaDay - Mayo de 2007 z www.aulaunix.org
2. dtrace:::BEGIN Ésta presentación es una introducción a DTrace y forma parte de la documentación de AulaUnix (http://www.aulaunix.org). ¡¡ BIENVENIDOS A TOD@S !!
3. dtrace:::BEGIN { trace(“¿De qué vamos a hablar?”); exit(0); } - Qué es DTrace - A quien está dirigido - Como funciona - Probes, providers, modules... - CHIME, un interfaz gráfico para DTrace - Preguntas iniciales - Referencias
4. ¿Qué es DTrace? - DTrace es una herramienta de depuración introducida en los sistemas operativos Solaris 10 y OpenSolaris que nos puede ayudar a depurar problemas sistemáticos y/o difíciles de diagnosticar con las herramientas y mecanismos tradicionales. - Instrumentación dinámica que examina la actividad de espacio de usuario (user-level) y del kernel de Solaris (kernel-level), ofreciéndonos una vista comprensible del comportamiento del sistema operativo y de las aplicaciones que se ejecutan sobre él. - Permite varios cientos de miles de puntos de instrumentación ( probes ), contando ya con más de 30000 . - Poderoso lenguaje de programación D (similar a C y awk, interpretado) que nos permite instanciar probes - Considerada actualmente como la única herramienta disponible que es lo suficientemente segura para utilizar en sistemas de producción, además con un insignificante impacto en el rendimiento (0% cuando no se emplea).
5. ¿Qué es DTrace? - Integra en una única herramienta funciones similares a las de truss, apptrace, prex y mdb (entre otros):
6. ¿Qué es DTrace? - Nos sirve para buscar errores en el software, probando qué es problema y qué no - Nos sirve para medir la magnitud del problema - Observación detallada: dispositivos como discos ó actividad de red - Observación de aplicaciones, tanto del sistema como de terceros - Captura de datos de profiling para análisis de rendimiento - Si existe un problema de latencia en algún lado, DTrace puede ayudar a encontrarlo
7. ¿Qué es DTrace? - Ejemplo #1 - Probando nuevos procesos que se ejecutan en el sistema:
8. ¿Qué es DTrace? - Ejemplo syscall con truss - truss sólo examina 1 proceso a la vez y además ralentiza el objetivo a probar
9. ¿Qué es DTrace? - Ejemplo syscall con DTrace - DTrace permite probar todos los procesos y además NO ralentiza!
10. Dtrace es, en pocas palabras: - Una herramienta - Un intérprete de lenguaje de programación - Un framework de instrumentación
11. ¿A quién está dirigido? - Cualquiera puede emplear DTrace desde el principio utilizando la documentación de los scripts ya escritos de DTraceToolkit ó los scripts de una única línea documentados en Solaris Performance and Tools . Al principio no necesitaremos escribir nuestros propios scripts, pero a medida que vayan surgiendo necesidades, encontraremos que pueden probar una mayor eficacia a la hora de resolver problemas en nuestros entornos. - No es necesario tener conocimientos del kernel para estudiar el código a nivel de usuario. - Existen muchos providers de alto nivel que pueden ser diseñados a medida para proveernos de una documentada abstracción del kernel. Dichos providers hacen tracing al kernel mucho mejor y más fácilmente de lo que se podamos creer inicialmente. - Comprender el kernel de Solaris es necesario para escribir scripts DTrace avanzados para los que de momento no existe un provider de alto nivel. Por ejemplo, para examinar la actividad TCP/IP en detalle.
12. ¿A quién está dirigido? - Desarrolladores de kernel: DTrace recoge datos de casi cualquier función de kernel, en cuestión de nanosegundos, incluyendo timestamp . También pueden analizar problemas de drivers, incluso en tiempo de arranque del sistema. - Administradores de sistemas: con DTrace pueden buscar y analizar problemáticas que antes eran imposibles ó muy difíciles de encontrar - Administradores de bases de datos: pueden analizar el rendimiento y throughput entre todos los componentes del sistema - Administradores de Seguridad: pueden auditar casi cualquier parte del sistema, así como descifrar problemas de malware
13. ¿Cómo funciona? - El lenguaje de programación D está basado en el lenguaje C, así que algún conocimiento inicial de éste lenguaje puede ayudar a su entendimiento. - D es bastante más fácil que C ya que sólo hay que aprender un pequeño número de funciones y tipo de variables para ser capaz de escribir poderosos scripts. Además los programas en D también son similares a los programas escritos en awk, lo cual puede resultar de ayuda - En D no existen estructuras de control ( if o bucles como while, for...), aunque de todas maneras los predicados nos permiten poner condiciones para ejecutar código.
14. ¿Cómo funciona? - Ejemplo script en D Imprimir por pantalla las llamadas al sistema que realiza la shell bash (bash.d): #!/usr/sbin/dtrace -s syscall:::entry /execname==?bash?/ { printf(?%s llamada?,probefunc); } Descripción del código: syscall:::entry descripción del probe / predicado / { printf(?%s llamada?,probefunc); acciones } Cuando un probe comienza la acción es ejecutado si el predicado se evalúa como true
15. ¿Cómo funciona? En ésta figura se ilustra el funcionamiento de DTrace: el comando dtrace(1M) utiliza una librería llamada libdtrace como punto de entrada de varios proveedores ( providers ) dentro del kernel de Solaris; cada uno de ellos nos ofrece una vista lógica de algunos subsistemas del kernel.
16. ¿Cómo funciona? - Cuando se ejecutan los programas escritos en D son compilados “al vuelo” en bytecodes que pueden ser interpretados dentro del kernel. - La máquina virtual de DTrace ejecuta los bytecodes para garantizar que sean seguros. - Si el código es seguro y tenemos los suficientes privilegios, el código se parchea dentro del kernel dinámicamente y es ejecutado como código de kernel . - Éste es el por qué los probes que no están activos no pueden crear ninguna sobrecarga.
17. ¿ Qué son los probes y providers ? - Un probe es un punto de instrumentación que puede ser seguido por DTrace. Por ejemplo, llamamos el probe "syscall:read:entry" cuando invocamos la llamada del sistema (syscall) read(2) y se llama a "syscall::read::return" cuando se completa la syscall read(2). Algunos ejemplo de probes: - syscall::read::entry Comienzo de llamada al sistema read() - proc:::exec-success Un proceso ha sido creado correctamente - io:::start Se ha producido una E/S - io:::done Se ha terminado una E/S - Ejecutando la instrucción dtrace -l podremos ver la lista de probes . - Con dtrace -n tomamos el nombre de la prueba y comienza a realizar el trace: dtrace -n syscall::exece:return
18. ¿ Qué son los probes y providers ? (continuación) - Existen 4 componentes para el nombre del probe : provider:module:function:name (proveedor:módulo:función:nombre), de manera que posteriormente podamos reconocer fácilmente los probes que puedan ser de nuestro interés. - El provider ó proveedor es una colección de ciertos probes , muy similar a una colección de funciones. Por ejemplo, el provider syscall nos ofrece una serie de probes para la entrada y retorno de todas las llamadas al sistema. - Los módulos corresponden a los módulos de kernel de Solaris. En caso de crear nuestros propios probes dentro de las aplicaciones, el módulo puede ser la clase ó el código del módulo en el que definimos el probe . Si el probe corresponde a una ubicación específica, el nombre del módulo es donde se localiza. - Las funciones son los nombres de las funciones del código en las que están situados los probes . - El nombre es el componente final del probe nos da una idea de cuando se ejecuta el probe , como por ejemplo BEGIN ó END
19. ¿Es seguro DTrace? Principios de diseño: - Sólo se pueden realizar probes seguros - No hay recursividad para los probes - Máquina virtual en kernel - Previene almacenar en memoria arbitraria del kernel - No hay loops en el kernel - No se permite ejecutar instrucciones ilegales mientras se esté en kernel - No hay división por cero - Protección E/S de espacio de memoria - Previene cargas desde memoria sin mapear
20. ¿Es seguro DTrace? (continuación) Para poder emplear DTrace tenemos que tener al menos uno de los siguientes privilegios (sólo ciertos grupos de privilegios permiten funcionar a Dtrace) : - dtrace_kernel permite acceso a nivel de kernel - dtrace_proc permite realizar probes en los procesos en los que el usuario tiene permisos. - dtrace_user permite a un usuario tener acceso a llamadas al sistema ( syscall ) y a ciertos perfiles de proveedores ( providers ) Si no estás seguro de los privilegios que tienes actualmente, ejecutando el comando 'ppriv $$' , obtendrás los privilegios que te ha proporcionado tu shell . Una forma de obtener permisos DTrace es añadir la siguiente línea a /etc/user_attr (reemplaza <user> con tu usuario): iban::::defaultpriv=basic,dtrace_proc,dtrace_kernel
21. Ejemplos - La mejor colección de ejemplos la podemos encontrar en DTraceToolkit. Brendan Gregg, -su autor- ha documentado la mayor colección de scripts hasta el momento. - Si tienes instalado Solaris Express Developer Edition, en el directorio /usr/demo/dtrace encontrarás más scripts. - También puedes usar tu navegador web para verlos todos, escribiendo la URL: file:///usr/demo/dtrace/index.html en la barra de dirección. NOTA: Al final de la ponencia podremos ver algunos ejemplos con DtraceToolkit, pues es la mayor colección a todos los niveles de scripts DTrace
22. CHIME – Un interfaz gráfico para DTrace CHIME es una herramienta gráfica que nos permite revisar visualmente lo que hace DTrace. Es una alternativa a las utilidades de línea de comandos (como por ejemplo intrstat) CHIME es más intuitivo y potencialmente más útil que la interfaz de comandos; en particular, la habilidad de visualizar los datos en tiempo real (de forma visual) añade una dimensión que nos faltaba para la observación del sistema:
24. CHIME – Un interfaz gráfico para DTrace - Para ejecutar CHIME es necesario tener al menos el build 35 de Solaris Nevada. - La ubicación de los binarios de CHIME es /opt/OSOL0chime/bin/chime - Debemos tener suficientes privilegios DTrace. Ésto no es problema si somos root, sin embargo quizás necesitemos ejecutar la instrucción xhost +a para que la aplicación Java de CHIME puede funcionar sobre nuestro DISPLAY. Una mejor forma de obtener permisos DTrace es añadir la siguiente línea a /etc/user_attr (reemplaza <user> con tu usuario): iban::::defaultpriv=basic,dtrace_proc,dtrace_kernel El privilegio dtrace_kernel nos dará acceso de sólo lectura a la máquina. Necesitaremos volver a logearnos en el sistema si queremos que los efectos se apliquen.
25. CHIME – Un interfaz gráfico para DTrace Una característica importante de CHIME es la habilidad de añadir nuevos displays (vistas) sin tener que recompilar (las vistas se describen en ficheros XML). Su sintaxis nos permite que los valores de cada programa DTrace puedan ser sustituidos detrás de cada escenario, permitiendo al usuario de CHIME seleccionar de una gama descrita las modificaciones del programa sin tener que saber nada sobre DTrace. CHIME se puede bajar desde la página del proyecto chime-project . Si creas una vista útil para CHIME, por favor compártela en dtrace-discuss junto con cualquier anécdota relacionada y así podrán agregarla a la página del proyecto para que otros puedan usarla :-)
26. CHIME – Un interfaz gráfico para DTrace Ejemplos de llamadas al sistema y E/S de dispositivos:
27. Preguntas iniciales - ¿Existe DTrace para otros sistemas operativos? No, de momento no. DTrace fue inventado por los ingenieros de Sun Microsystems Bryan Cantrill , Mike Shapiro y Adam Leventhal únicamente para Solaris 10 y OpenSolaris. Hay un proyecto en vía de desarrollo para portar DTrace a FreeBSD, que además ya está a un nivel avanzado, ejecutando algunas de las principales características. A muchos de los ingenieros de DTrace les gustaría verlo en funcionamiento en otros sistemas operativos, de hecho apoyan que DTrace sea portado a otras plataformas. De todas maneras, Apple ya anunció que DTrace tendrá mucha influencia en las herramientas de desarrollo para Mac OS X 10.5, más conocido como "Leopard", previsto para Otoño del 2007. Dtrace NO está disponible para Solaris 9 y no hay planes de que lo esté en el futuro
28. Preguntas iniciales - ¿No se había inventado ya algo similar hace 20 años para los mainframes? No, DTrace puede probar dinámicamente cualquier función de entrada/retorno en un kernel en funcionamiento (unos 36.000 probes); incluso cualquier función en el código de espacio de usuario y librerías (por ejemplo, mozilla y sus librerías suman unas 100.000 probes); instrucciones a nivel de usuario (sobre los 200.000 probes solo para la shell Bourne) y sin perder rendimiento. - ¿Existen libros sobre DTrace? Sí, existen de momento dos libros excelentes sobre Dtrace: “ The DTrace Guide” es la mejor referencia para DTrace que cubre el lenguaje, providers y montones de ejemplos más. Fue escrito por los ingenieros de DTrace y es una referencia obligada. “ Solaris Performance and Tools“ demuestra el uso de DTrace para la observación y el depurado del rendimiento. Fué escrito por Brendan Gregg (autor del DTraceToolkit), Richard McDougall y Jim Mauro (autor de “Solaris Internals”) .
29. Referencias Puedes encontrar extensa información sobre DTrace en los siguientes enlaces: Comunidad OpenSolaris - DTrace http://www.opensolaris.org/os/community/dtrace/ Sun BigAdmin http://www.sun.com/bigadmin/content/dtrace/ DTraceToolkit http://www.opensolaris.org/os/community/dtrace/FAQ/dtracetoolkit