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.