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.
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. |
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.
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.
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 |