DTrace es una de las características mas novedosas e importantes introducidas a partir de Solaris 10. Tanto es así que ya se han anunciado ports del sistema DTrace para otros sistemas operativos

Existen tanto en la pagina de BigAdmin como en la comunidad opensolaris sobre DTrace numerosos recursos de introducción a DTrace, pero quiero introducir mi punto de vista sobre lo que voy viendo.

Utilizo recursos de distintas fuentes, sobre todo la fantástica Guia de DTrace en la pagina web de SUN, y eso se notará sobre todo en los primeras entregas.

No obstante a medida que vayamos avanzando intentaremos introducir scripts y codigo original (que sino esto es un aburrido copy&paste :-P)

¿Que es eso de DTrace?

DTrace es un sistema, que permite obtener información de utilidad sobre virtualmente cualquier cosa que haga tanto el sistema operativo como los programas que se ejecutan encima de el.

Para que me entendais, es como poder tener un depurador sobre todo el sistema (tanto kernel como programas).

Esto no sería nada muy especial si no fuera por el hecho de que la depuración se puede hacer sobre sistemas en producción, con un bajisimo impacto en el rendimiento (practicamente 0 si no se hace uso de el, aunque este activo).

El administrador maneja el sistema DTrace basicamente mediante el comando dtrace(1M) y programas en lenguaje D (que suelen tener extension .d)

El lenguaje D es un lenguaje hibrido entre C y algo de awk(1) , que sirve para “enganchar” trozos de codigo a probes.

Un ejemplo de lenguaje D es el siguiente fichero (holamundo.d):

dtrace:::BEGIN
{
      trace("Hola Mundo");
      exit(0);
}

Este programa lo que hace es cada vez que “ocurra” el probe BEGIN dentro del provider dtrace se ejecute el codigo entre corchetes, en este caso mediante el comando trace(”Hola Mundo”) imprimiria en la salida estandar un bonito “Hola Mundo” y saldria ;-)

Se ejecutaria de la siguiente manera:

root@enzima2 ~ # dtrace -s holamundo.d
dtrace: script 'holamundo.d' matched 1 probe
CPU     ID                    FUNCTION:NAME
0      1                           :BEGIN   Hola Mundo

root@enzima2 ~ #

En concreto este probe BEGIN dentro del provider dtrace ocurre cuando se inicia un programa D.

Existen mas de 30000 probes (comprobad los que estan disponibles mediante un “dtrace -l”) en el sistema Solaris 10, pudiendo un programador añadir mas cosas que comprobar (probes) implementando lo que se llama un provider dentro de sus programas.

Por ejemplo, el autor de un servidor web puede añadir codigo a este para que el administrador pueda ejecutar acciones (normalmente de información) cada vez que se solicita una pagina web, cada vez ocurre un error u otras informaciones de alto nivel sobre el programa.

No obstante, aunque no existiera ese código dentro del programa, el administrador siempre puede obtener mediante dtrace(1m) información de menor nivel sobre el proceso (por ejemplo, cuando abre un fichero, cuando solicita mas memoria etc etc).

“Eso me suena, existen alternativas como truss(1) o strace en linux”

tanto truss(1) como strace influyen muchisimo en el rendimiento de la aplicacion a controlar, además de que solo sirven para capturar llamadas al sistema de un determinado proceso. De hecho es relativamente sencillo construir un programa D que emule el comportamiento de estas herramientas (mas adelante, en este tutorial).

“Bah, linux ya tiene algo parecido llamado KProbes”

Aparte de que KProbes no viene con el sistema operativo y solamente esta hecho para depurar el kernel mejor compararlo vosotros mismos o mirar tambien esta entrada en el blog de James Dickens

continuará…

Bien ya hemos visto mas o menos lo que es el DTrace y hemos visto el hola mundo de rigor, en la proxima entrega haremos algo mas útil, implementar un sencillo sustituto de truss.