Guía de seguimiento dinámico de Solaris

Ejemplo

Examine el siguiente resultado 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 del resultado anterior, puede concluir que el campo xcal parece demasiado alto, especialmente dada la relativa inactividad del sistema. mpstat determina el valor en el campo xcal examinando el campo xcalls de la estadística de núcleo sys. Esta anomalía se puede explorar fácilmente habilitando el sondeo xcalls sysinfo, tal y como se muestra en el siguiente ejemplo:


# 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

El resultado muestra dónde buscar el origen de las llamadas cruzadas. Una serie de procesos find(1) producen la mayoría de las llamadas cruzadas. La siguiente secuencia de comandos de D se puede utilizar para comprender el problema con más detalle:

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;
}

Esta secuencia de comandos utiliza el proveedor syscall para atribuir las llamadas cruzadas de find a una llamada de sistema concreta. Es posible que algunas llamadas cruzadas, como las resultantes de los fallos de página, no procedan de llamadas de sistema. La secuencia de comandos imprime “<none>” en estos casos. Al ejecutar la secuencia de comandos se produce un resultado parecido al siguiente ejemplo:


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

Este resultado indica que la mayoría de las llamadas cruzadas inducidas por find son inducidas a su vez por llamadas de sistema getdents(2). Una mayor exploración dependerá de la dirección en la que desea explorar. Si desea comprender por qué los procesos find realizan llamadas a getdents, podría escribir una secuencia de comandos de D para agregarse en ustack() cuando find induce una llamada cruzada. Si desea comprender por qué las llamadas a getdents inducen llamadas cruzadas, podría escribir una secuencia de comandos de D para agregarse en stack() cuando find induce una llamada cruzada. Independientemente del siguiente paso, la presencia del sondeo xcalls ha permitido que descubra rápidamente la causa origen de un resultado inusual de supervisión.