Guia de rastreamento dinâmico Solaris

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.