Um teste profile- n é acionado a cada intervalo fixo em cada CPU no nível de interrupção alto. O intervalo de acionamento do teste é indicado pelo valor n: a origem da interrupção será acionada n vezes por segundo. n também pode ter um sufixo de tempo opcional, em cujo caso n é interpretado em unidades indicadas pelo sufixo. Os sufixos válidos e as unidades que eles indicam estão listados na Tabela 19–1.
Tabela 19–1 Sufixos de tempo válidos|
Sufixo |
Unidades de tempo |
|---|---|
|
nsec ou ns |
nanossegundos |
|
usec ou us |
microssegundos |
|
msec ou ms |
milissegundos |
|
sec ou s |
segundos |
|
min ou m |
minutos |
|
hour ou h |
horas |
|
day ou d |
dias |
|
hz |
hertz (freqüência por segundo) |
O exemplo seguinte cria um teste a ser acionado a 97 hertz para fazer amostragem do processo que está em execução no momento:
#pragma D option quiet
profile-97
/pid != 0/
{
@proc[pid, execname] = count();
}
END
{
printf("%-8s %-40s %s\n", "PID", "CMD", "COUNT");
printa("%-8d %-40s %@d\n", @proc);
}
Executar o exemplo acima por um breve período de tempo resulta em uma saída semelhante ao exemplo seguinte:
# dtrace -s ./prof.d ^C PID CMD COUNT 223887 sh 1 100360 httpd 1 100409 mibiisa 1 223887 uname 1 218848 sh 2 218984 adeptedit 2 100224 nscd 3 3 fsflush 4 2 pageout 6 100372 java 7 115279 xterm 7 100460 Xsun 7 100475 perfbar 9 223888 prstat 15 |
Você também usa o provedor profile-n para fazer amostragem de informações sobre o processo em execução. O script de D de exemplo seguinte usa um teste profile de 1.001 hertz para fazer amostragem da prioridade atual de um processo especificado:
profile-1001
/pid == $1/
{
@proc[execname] = lquantize(curlwpsinfo->pr_pri, 0, 100, 10);
}
Para ver este script de exemplo em ação, digite os seguintes comandos em uma janela:
$ echo $$ 12345 $ while true ; do let i=0 ; done |
Em outra janela, execute o script de D por um breve período de tempo, substituindo 12345 pelo PID que o comando echo retornou:
# dtrace -s ./profpri.d 12345
dtrace: script './profpri.d' matched 1 probe
^C
ksh
value ------------- Distribution ------------- count
< 0 | 0
0 |@@@@@@@@@@@@@@@@@@@@@ 7443
10 |@@@@@@ 2235
20 |@@@@ 1679
30 |@@@ 1119
40 |@ 560
50 |@ 554
60 | 0
|
Esta saída mostra a diferença da classe de programação de compartilhamento de tempo. Como o processo do shell está girando na CPU, sua prioridade está constantemente sendo baixada pelo sistema. Se o processo do shell estivesse sendo executado menos freqüentemente, sua prioridade seria mais alta. Para ver este resultado, digite Control-C no shell que está girando e execute o script novamente:
# dtrace -s ./profpri.d 494621 dtrace: script './profpri.d' matched 1 probe |
Agora no shell, digite alguns caracteres. Quando você terminar o script do DTrace, uma saída parecida com o exemplo seguinte aparecerá:
ksh
value ------------- Distribution ------------- count
40 | 0
50 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
60 | 0
|
Como o processo do shell estava inativo, esperando a entrada do usuário em vez de girando na CPU, quando ele foi executado, sua prioridade era muito mais alta.