Guía de seguimiento dinámico de Solaris

Utilización de predicados incluibles en memoria caché

Los predicados de DTrace se utilizan para filtrar los datos que no desee a partir del experimento al realizar un seguimiento de los datos sólo si se detecta que una condición determinada es verdadera (true). Si habilita muchos sondeos, normalmente utilizará predicados con un formato que identifique un subproceso o subprocesos de interés, como por ejemplo /self->traceme/ o /pid == 12345/. Aunque muchos de estos predicados se evalúan como un valor falso (false) para la mayor parte de los subprocesos de la mayoría de los sondeos, la evaluación en sí misma puede convertirse en costosa si se realiza en miles de sondeos. Para reducir este coste, DTrace almacena en memoria caché la evaluación de un predicado si incluye sólo variables de subprocesos locales (por ejemplo, /self->traceme/) o variables inmutables (por ejemplo, /pid == 12345/). El coste de evaluar un predicado incluido en memoria caché es mucho menor que el de evaluar un predicado no incluido en caché, especialmente si el predicado implica variables de subproceso local u otras operaciones relativamente costosas. Aunque la inclusión de predicados en memoria intermedia es transparente para el usuario, implica determinadas directrices para la construcción de predicados óptimos, tal y como se muestra en la tabla siguiente:

Incluible en caché 

No incluible en caché 

self->mumble

mumble[curthread], mumble[pid, tid]

execname

curpsinfo->pr_fname, curthread->t_procp->p_user.u_comm

pid

curpsinfo->pr_pid, curthread->t_procp->p_pipd->pid_id

tid

curlwpsinfo->pr_lwpid, curthread->t_tid

curthread

curthread->cualquier miembro , curlwpsinfo->cualquier miembro, curpsinfo->cualquier miembro

No se recomienda el siguiente ejemplo:

syscall::read:entry
{
	follow[pid, tid] = 1;
}

fbt:::
/follow[pid, tid]/
{}

syscall::read:return
/follow[pid, tid]/
{
	follow[pid, tid] = 0;
}

Es preferible el siguiente ejemplo, que utiliza variables de subprocesos locales:

syscall::read:entry
{
	self->follow = 1;
}

fbt:::
/self->follow/
{}

syscall::read:return
/self->follow/
{
	self->follow = 0;
}

Para poder incluirlo en memoria caché, un predicado debe contener exclusivamente expresiones incluibles en caché. Los siguientes predicados son todos incluibles en caché:

/execname == "myprogram"/
/execname == $$1/
/pid == 12345/
/pid == $1/
/self->traceme == 1/

Los siguientes ejemplos, que utilizan variables locales, no son incluibles en caché:

/execname == one_to_watch/
/traceme[execname]/
/pid == pid_i_care_about/
/self->traceme == my_global/