Les prédicats DTrace permettent de filtrer des données inutiles de l'expérimentation en suivant des données suivies uniquement si une condition spécifiée s'avère ne pas être vraie. Lors de l'activation de nombreuses sondes, vous utilisez généralement des prédicats sous une forme identifiant un ou plusieurs threads spécifiques, comme /self->traceme/ ou /pid == 12345/. Bien qu'un grand nombre de ces prédicats évaluent une valeur fausse pour la plupart des threads d'une majorité de sondes, l'évaluation elle-même peut consommer beaucoup de ressources si elle est effectuée par plusieurs centaines de sondes. Pour réduire cette consommation, DTrace met en cache l'évaluation d'un prédicat s'il ne contient que des variables locales de thread (par exemple, /self->traceme/) ou des variables non mutables (par exemple, /pid == 12345/). La consommation de l'évaluation d'un prédicat mis en cache est bien inférieure à celle de l'évaluation d'un prédicat non mis en cache, tout particulièrement si le prédicat implique des variables locales de thread, des comparaisons de chaîne ou d'autres opérations qui consomment relativement beaucoup de ressources. Alors que la mise en cache d'un prédicat est transparente pour l'utilisateur, elle implique certaines autres directives de construction de prédicats optimum, tel qu'illustré dans le tableau suivant :
Peut être mis en cache |
Ne peut pas être mis en cache |
---|---|
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->tout membre, curlwpsinfo->tout membre, curpsinfo->tout membre |
L'exemple suivant n'est pas recommandé :
syscall::read:entry { follow[pid, tid] = 1; } fbt::: /follow[pid, tid]/ {} syscall::read:return /follow[pid, tid]/ { follow[pid, tid] = 0; }
L'exemple suivant utilisant des variables locales de thread est préférable :
syscall::read:entry { self->follow = 1; } fbt::: /self->follow/ {} syscall::read:return /self->follow/ { self->follow = 0; }
Pour pouvoir être mis en cache, un prédicat doit être constitué exclusivement d'expressions pouvant être mises en cache. Les prédicats suivants peuvent tous être mis en cache :
/execname == "myprogram"/ /execname == $$1/ /pid == 12345/ /pid == $1/ /self->traceme == 1/
Les exemples suivants, qui utilisent des variables globales, ne peuvent pas être mis en cache :
/execname == one_to_watch/ /traceme[execname]/ /pid == pid_i_care_about/ /self->traceme == my_global/