Dtrace posee sondas (probes en ingles) que pueden ser usadas en cualquier aplicativo "C" y "Java" (desde el nuevo componente DTRACE incluido en la JVM) para monitorear la ejecución de los mismos. Lentamente, un sinfin de servidores de software con Solaris están integrando las sondas de dtrace en su core funcional. El miedo inicial de un usuario nuevo, es que Dtrace, como cualquier otra herramienta de monitorización, impacte en la performance del sistema. Dtrace reemplaza las sondas con instrucciones
"nop" (instruccciones
nulas que no consumen tiempo de ejecución ni otro recurso) cuando no está en uso. Cuando los usuarios usan típicamente las sondas, estas tienen un impacto mínimo sobre la performance. Un simple test para ver que pasa mientras se corre un proceso, es el siguiente:
(testapp.c)
#include <stdio.h>
#include <unistd.h>
#include <sys/sdt.h>
void func()
{
DTRACE_PROBE(firsttestapp, query__func);
}
int main()
{
int i = 0;
for(i = 0; i < 100; ++i)
{
func();
sleep(2);
printf("returned from func call\n");
fflush(stdout);
}
}
Y un simple proveedor de la sonda:
(mytestapp.d)
provider firsttestapp {
probe query__func();
};
En esta prueba. func será llamado cada 2 segundos. func tiene una sonda de dtrace que no hace nada. Esto se compila en Solaris de la siguiente manera:
$ cc -c -xarch=generic -g testapp.c
$ dtrace -G -32 -s mytestapp.d testapp.o
$ cc -xarch=generic -g mytestapp.o testapp.o -o testapp
Ahora corremos el aplicativo, sin dtrace, y analizamos lo que ocurre:
$ dbx ./testapp
(dbx) dis func
0x00011410: func : save %sp, -96, %sp
0x00011414: func+0x0004: nop
0x00011418: func+0x0008: nop
0x0001141c: func+0x000c: ret
Notar que la función "func" no tiene ninguna instrucción interna. Tiene solo 2 instrucciones nop. Si corremos la aplicación y el programa dtrace desde otra terminal que usa esta sonda, para ver que le pasa a la aplicación durante el runtime
bash-3.00# dtrace -l | grep testapp
61026 firsttestapp26498 testapp func query-func
# dtrace -n 'firsttestapp*::func:query-func { @[probefunc] = count(); }'
dtrace: description 'firsttestapp*::func:query-func ' matched 1 probe
(dbx) dis func
0x00011410: func : save %sp, -96, %sp
0x00011414: func+0x0004: nop
0x00011418: func+0x0008: ta %icc,0x00000038
0x0001141c: func+0x000c: ret
0x00011420: func+0x0010: restore
Ahora 1 de las instrucciones nop es reemplazada con la trap instruction "ta %icc,".
Esto demuestra que cuando las sondas son utilizadas, las instrucciones "nop" son reemplazadas con instrucciones trap (que permiten la monitorización).
Cuando las sondas no están en uso, simplemente son instrucciones "nop". Esta es la razón por la cual las sondas no tienen impacto durante el runtime cuando no están en uso.
Esta demostración la encuentrán en Ingles en el siguiente link:
http://blogs.sun.com/basant/entry/performance_impact_of_dtrace_probes
Por último les dejo un par de links para que puedan interiorizarme más sobre DTRACE
http://es.opensolaris.org/Categorias/Dtrace/
http://blog.davidsm.com/2005/12/17/introduccion-a-dtrace-para-tontos-como-tu-y-como-yo-i/