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.