Guia de rastreamento dinâmico Solaris

Testes profile-n

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.