Guia de rastreamento dinâmico Solaris

Capítulo 23 Provedor sysinfo

O provedor sysinfo disponibiliza testes que correspondem às estatísticas do kernel classificadas pelo nome sys. Como estas estatísticas fornecem a entrada dos utilitários de monitoramento do sistema como o mpstat(1M), o provedor sysinfo ativa a rápida exploração do comportamento anormal observado.

Testes

O provedor sysinfo disponibiliza testes que correspondem aos campos na estatística do kernel chamada sys: um teste fornecido por sysinfo é acionado imediatamente antes do valor sys correspondente ser incrementado. O exemplo seguinte mostra como exibir ambos os nomes e os valores atuais da estatística do sistema chamada sys usando o comando kstat(1M).


$ kstat -n sys
module: cpu                             instance: 0
name:   sys                             class:    misc
	bawrite                         123
	bread                           2899
	bwrite                          17995
...

Os testes do sysinfo estão descritos na Tabela 23–1.

Tabela 23–1 Testes do sysinfo

bawrite

Teste que é acionado sempre que um buffer está prestes a ser gravado assincronamente em um dispositivo. 

bread

Teste que é acionado sempre que um buffer é fisicamente lido a partir de um dispositivo. bread é acionado depois que o buffer tiver sido solicitado do dispositivo, mas antes que o bloqueio impeça a sua conclusão.

bwrite

Teste que é acionado sempre que um buffer está prestes a ser gravado em um dispositivo, seja síncrona ou assincronamente.

idlethread

Teste que é acionado sempre que uma CPU entra no loop inativo. 

intrblk

Teste que é acionado sempre que um segmento de interrupção é bloqueado. 

inv_swtch

Teste que é acionado sempre que um segmento em execução é forçado a desistir involuntariamente da CPU. 

lread

Teste que é acionado sempre que um buffer é logicamente lido a partir de um dispositivo. 

lwrite

Teste que é acionado sempre que um buffer é logicamente gravado a partir de um dispositivo. 

modload

Teste que é acionado sempre que um módulo do kernel é carregado. 

modunload

Teste que é acionado sempre que um módulo do kernel é descarregado. 

msg

Teste que é acionado sempre que uma chamada do sistema msgsnd(2) ou msgrcv(2) é feita, mas antes que as operações da fila de mensagens tenha sido realizada.

mutex_adenters

Teste que é acionado sempre que é feita uma tentativa de adquirir o bloqueio adaptativo com proprietário. Se este teste for acionado, um dos adaptive-block do provedor lockstat ou testes do adaptive-spin também serão acionados. Consulte o Capítulo 18Provedor lockstat para obter detalhes.

namei

Teste que é acionado sempre que uma pesquisa de nome é tentada no sistema de arquivos. 

nthreads

Teste que é acionado sempre que um segmento é criado. 

phread

Teste que é acionado sempre que uma leitura de E/S básica está prestes a ser realizada. 

phwrite

Teste que é acionado sempre que uma gravação de E/S básica está prestes a ser realizada. 

procovf

Teste que é acionado sempre que um novo processo não pode ser criado porque o sistema está fora das entradas de tabela do processo. 

pswitch

Teste que é acionado sempre que uma CPU alterna entre executar um segmento para executar outro. 

readch

Teste que é acionado depois de cada leitura bem sucedida, mas antes que o controle seja retornado para o segmento que está realizando a leitura. Uma leitura pode ocorrer através das chamadas do sistema read(2), readv(2) ou pread(2) arg0 contém o número de bytes que foram lidos com êxito.

rw_rdfails

Teste que é acionado sempre que há uma tentativa de ler-bloquear um bloqueio de leitores/gravador quando o bloqueio já está sendo mantido por um gravador, ou desejado por um gravador. Se este teste for acionado, o teste rw-block do provedor lockstat também será acionado. Consulte o Capítulo 18Provedor lockstat para obter detalhes.

rw_wrfails

Teste que é acionado sempre que há uma tentativa de gravar-bloquear um bloqueio de leitores/gravador quando o bloqueio é mantido por alguns leitores ou por outro gravador. Se este teste for acionado, o teste rw-block do provedor lockstat também será acionado. Consulte o Capítulo 18Provedor lockstat para obter detalhes.

sema

Teste que é acionado sempre que uma chamada do sistema semop(2) é feita, mas antes que quaisquer operações de semáforo tenham sido realizadas.

sysexec

Teste que é acionado sempre que uma chamada do sistema exec(2) é feita.

sysfork

Teste que é acionado sempre que uma chamada do sistema fork(2) é feita.

sysread

Teste que é acionado sempre que uma chamada do sistema read(2), readv(2) ou pread(2) é feita.

sysvfork

Teste que é acionado sempre que uma chamada do sistema vfork(2) é feita.

syswrite

Teste que é acionado sempre que uma chamada do sistema write(2), writev(2) ou pwrite(2) é feita.

trap

Teste que é acionado sempre que uma interceptação do processador ocorre. Observe que alguns processadores, em particular variantes do UltraSPARC, manipulam algumas interceptações leves através de um mecanismo que não faz com que este teste seja acionado. 

ufsdirblk

Teste que é acionado sempre que um bloqueio de diretório é lido a partir de um sistema de arquivos UFS. Consulte ufs(7FS) para obter detalhes sobre UFS.

ufsiget

Teste que é acionado sempre que um inode é recuperado. Consulte ufs(7FS) para obter detalhes sobre UFS.

ufsinopage

Teste que é acionado depois que um inode no núcleo sem quaisquer páginas de dados associadas tiver sido disponibilizado para reutilização. Consulte ufs(7FS) para obter detalhes sobre UFS.

ufsipage

Teste que é acionado depois que um inode no núcleo com quaisquer páginas de dados associadas tiver sido disponibilizado para reutilização. Este teste é acionado depois que as páginas de dados associadas forem movidas para o disco. Consulte ufs(7FS) para obter detalhes sobre UFS.

writech

Teste que é acionado depois de cada gravação bem sucedida, mas antes que o controle seja retornado para o segmento que está realizando a gravação. Uma leitura pode ocorrer através de chamadas do sistema write(2), writev(2) ou pwrite(2). arg0 contém o número de bytes que foram gravados com êxito.

xcalls

Teste que é acionado sempre que uma chamada cruzada está prestes a ser feita. Uma chamada cruzada é o mecanismo do sistema operacional de uma CPU para solicitar o funcionamento imediato de outra CPU. 

Argumentos

Os argumentos para testes sysinfo são os seguintes:

arg0

O valor pelo qual as estatísticas devem ser incrementadas. Para a maioria dos testes, este argumento é sempre 1, mas para alguns testes este argumento pode ter outros valores. 

arg1

Um ponteiro para o valor atual da estatística a ser incrementada. Este valor é uma quantidade de 64 bits que será incrementada pelo valor de arg0. Cancelar a referência deste ponteiro permitirá que os consumidores determinem a contagem atual das estatísticas correspondentes ao teste.

arg2

Um ponteiro para a estrutura cpu_t que corresponde à CPU na qual as estatísticas devem ser incrementadas. Esta estrutura é definida em <sys/cpuvar.h>, mas é parte da implementação do kernel e deve ser considerada Privada.

O valor de arg0 é 1 para a maioria dos testes sysinfo . Entretanto, os testes readch e writech definem arg0 como o número de bytes lidos ou gravados, respectivamente. Este recurso permite que você determine o tamanho das leituras por nome de executável, conforme mostrado no exemplo seguinte:


# dtrace -n readch'{@[execname] = quantize(arg0)}'
dtrace: description 'readch' matched 4 probes
^C
  xclock                                            
           value  ------------- Distribution ------------- count    
              16 |                                         0        
              32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1        
              64 |                                         0        

  acroread                                          
           value  ------------- Distribution ------------- count    
              16 |                                         0        
              32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3        
              64 |                                         0        

  FvwmAuto                                          
           value  ------------- Distribution ------------- count    
               2 |                                         0        
               4 |@@@@@@@@@@@@@                            13       
               8 |@@@@@@@@@@@@@@@@@@@@@                    21       
              16 |@@@@@                                    5        
              32 |                                         0        

  xterm                                             
           value  ------------- Distribution ------------- count    
              16 |                                         0        
              32 |@@@@@@@@@@@@@@@@@@@@@@@@                 19       
              64 |@@@@@@@@@                                7        
             128 |@@@@@@                                   5        
             256 |                                         0        

  fvwm2                                             
           value  ------------- Distribution ------------- count    
              -1 |                                         0        
               0 |@@@@@@@@@                                186      
               1 |                                         0        
               2 |                                         0        
               4 |@@                                       51       
               8 |                                         17       
              16 |                                         0        
              32 |@@@@@@@@@@@@@@@@@@@@@@@@@@               503      
              64 |                                         9        
             128 |                                         0        

  Xsun                                              
           value  ------------- Distribution ------------- count    
              -1 |                                         0        
               0 |@@@@@@@@@@@                              269      
               1 |                                         0        
               2 |                                         0        
               4 |                                         2        
               8 |@                                        31       
              16 |@@@@@                                    128      
              32 |@@@@@@@                                  171      
              64 |@                                        33       
             128 |@@@                                      85       
             256 |@                                        24       
             512 |                                         8        
            1024 |                                         21       
            2048 |@                                        26       
            4096 |                                         21       
            8192 |@@@@                                     94       
           16384 |                                         0

O provedor sysinfo define arg2 como um ponteiro para cpu_t, uma estrutura interna para a implementação do kernel. Os testes sysinfo são acionados na CPU na qual as estatísticas estão sendo incrementadas. Use o membro cpu_id da estrutura cpu_t para determinar a CPU de seu interesse.

Exemplo

Examine a seguinte saída de mpstat(1M):


CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
 12   90  22 5760   422  299  435   26   71  116   11  1372    5  19  17  60
 13   46  18 4585   193  162  431   25   69  117   12  1039    3  17  14  66
 14   33  13 3186   405  381  397   21   58  105   10   770    2  17  11  70
 15   34  19 4769   109   78  417   23   57  115   13   962    3  14  14  69
 16   74  16 4421   437  406  448   29   77  111    8  1020    4  23  14  59
 17   51  15 4493   139  110  378   23   62  109    9   928    4  18  14  65
 18   41  14 4204   494  468  360   23   56  102    9   849    4  17  12  68
 19   37  14 4229   115   87  363   22   50  106   10   845    3  15  14  67
 20   78  17 5170   200  169  456   26   69  108    9  1119    5  21  25  49
 21   53  16 4817    78   51  394   22   56  106    9   978    4  17  22  57
 22   32  13 3474   486  463  347   22   48  106    9   769    3  17  17  63
 23   43  15 4572    59   34  361   21   46  102   10   947    4  15  22  59

A partir da saída acima, você pode concluir que o campo xcal parece estar muito alto, especialmente dada a inatividade relativa do sistema. mpstat determina o valor no campo xcal, examinando o campo xcalls da estatística do kernel sys. Portanto, esta aberração pode ser explorada facilmente, ativando o teste sysinfo de xcalls, conforme mostrado no exemplo seguinte:


# dtrace -n xcalls'{@[execname] = count()}'
dtrace: description 'xcalls' matched 4 probes
^C
  dtterm                                                            1
  nsrd                                                              1
  in.mpathd                                                         2
  top                                                               3
  lockd                                                             4
  java_vm                                                          10
  ksh                                                              19
  iCald.pl6+RPATH                                                  28
  nwadmin                                                          30
  fsflush                                                          34
  nsrindexd                                                        45
  in.rlogind                                                       56
  in.routed                                                       100
  dtrace                                                          153
  rpc.rstatd                                                      246
  imapd                                                           377
  sched                                                           431
  nfsd                                                           1227
  find                                                           3767

A saída mostra onde procurar a origem das chamadas cruzadas. Alguns processos do find(1) estão causando a maioria das chamadas cruzadas. O script de D seguinte pode ser usado para entender o problema em maiores detalhes:

syscall:::entry
/execname == "find"/
{
	self->syscall = probefunc;
	self->insys = 1;
}

sysinfo:::xcalls
/execname == "find"/
{
	@[self->insys ? self->syscall : "<none>"] = count();
}

syscall:::return
/self->insys/
{
	self->insys = 0;
	self->syscall = NULL;
}

Este script usa o provedor syscall para atribuir chamadas cruzadas de find para uma chamada do sistema específica. Algumas chamadas cruzadas, tais como aquelas resultantes de falhas de página, podem não emanar de chamadas do sistema. O script imprime “<none>” nestes casos. Executar o script resultará numa saída semelhante ao exemplo seguinte:


# dtrace -s ./find.d
 dtrace: script './find.d' matched 444 probes
^C
  <none>                                                            2
  lstat64                                                        2433
  getdents64                                                    14873

Esta saída indica que a maioria das chamadas cruzadas induzidas por find são, por sua vez, induzidas pelas chamadas do sistema getdents(2). Uma exploração mais profunda dependerá da direção em que você deseja explorar. Se quiser entender por que os processos find estão fazendo chamadas a getdents , você poderia escrever um script de D para agregar em ustack() quando find induzir uma chamada cruzada. Se quiser entender por que as chamadas para getdents estão induzindo chamadas cruzadas, você poderia escrever um script de D para agregar em stack() quando find induzir uma chamada cruzada. Qualquer que seja o seu próximo passo, a presença do teste xcalls permitiu que você descobrisse rapidamente a causa principal da saída de monitoramento incomum.

Estabilidade

O provedor sysinfo usa o mecanismo de estabilidade do DTrace para descrever suas estabilidades, conforme mostrado na tabela seguinte. Para obter mais informações sobre o mecanismo de estabilidade, consulte o Capítulo 39Estabilidade.

Elemento 

Estabilidade de nome 

Estabilidade de dados 

Classe de dependência 

Provedor 

Desenvolvendo 

Desenvolvendo 

ISA

Módulo 

Privada 

Privada 

Desconhecida 

Função 

Privada 

Privada 

Desconhecida 

Nome 

Desenvolvendo 

Desenvolvendo 

ISA

Argumentos 

Privada 

Privada 

ISA