Mpstat

Page last edited hace 2081 días 9 horas
De Solaris-ES
Saltar a: navegación, buscar

Que es mpstat[editar]

Con este comando vamos a ver qué está ocurriendo con los procesadores del sistema, es decir, en qué están empleando su tiempo,
esto nos ayudará a que nos aproximemos al diagnostico. Para ver qué están haciendo los procesadores de nuestro sistema
utilizaremos el comando mpstat. 

La salida del comando muestra una fila por cada uno de los procesadores presentes en el sistema y una serie de columnas con
estadísticas sobre distintos elementos, cada una de las columnas vienen explicadas en la documentación del man, por lo tanto no
vamos a perder tiempo explicándolas y solo vamos a ver las que pueden ser más interesante para nosotros en estos momentos.

Salida del comando[editar]

# mpstat 3
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0  157  13 2767   301   13  168    4   24  110    1  7161   41  15   0  45
  1  240  22  659   641  493  293    3   53  270    9  1551    8  26   0  66
  2  185  23 1333    96   12  132    6   19  159    1  9980   56  16   0  29
  3  244  21  740   189   21  298    3   53  269   10  2414    9  27   0  64
  4  165  20  601   495  346  205    7   35  244    0  5501   31  19   0  50
  5  110  26  785   212   27  321    2   57  265    5  2668   13  16   0  71
  6   77   6   43    89    5  137    6   27   60   11  5116   67   5   0  27
  7  112  13  804   162   15  250    1   43  244    4  2531   11  21   0  69
  8  252  35 1034   190   22  302    4   44  253   17  2542   20  24   0  56
  9  333  34 1263   222   21  346    3   62  263   11  2125    9  25   0  66
 10  476  21  361   242  111  202    6   28  348    1  4625   23  28   0  49
 11  256  16 1121   199   34 8948    3   43  202   12 15858   19  20   0  61
 12  516  13 1996   162   26  244    3   38  338    7  2181   13  27   0  60
 13  232  17  261   182   20  279    3   47  207   14  4612   25  20   0  54
 14  443  20 3511   187   39  257    4   39  234    2  4346   23  24   0  53
 15   61   6  465   548  484  125    7   22  164    0  6994   43  16   0  41

Estadísticas desplegadas[editar]

Minor faults (minf)[editar]

Fallos menores de memoria, estos fallos afectan a los accesos a memoria y se tratan de fallos de cache, por lo 
tanto no afectan, de forma directa, al rendimiento del sistema. Este tipo de fallos nos pueden servir de indicativo sobre el
comportamiento de la aplicación. Los fallos de memoria se deben analizar dentro del contexto de uso de memoria.

DTrace minf[editar]

# dtrace -n 'vminfo:::as_fault { @execs[execname] = count() }'

dtrace: description 'vminfo:::as_fault ' matched 1 probe

sac                                                               1
mpstat                                                           10
uname                                                            36
dtrace                                                           47
ostname                                                          72
sh                                                              142
procmail                                                        165
fetchmail                                                       224
cron                                                            278
spamassassin                                                   2964

Major faults (majf)[editar]

Indica el numero de fallos mayores de memoria. 

DTrace majf[editar]

# dtrace -n 'vminfo:::maj_fault{ @execs[execname] = count() }'

dtrace: description 'vminfo:::maj_fault ' matched 1 probe

awk                                                               1
sshd                                                              1
bash                                                             11

Cross calls (xcall)[editar]

Refleja el número de cross-call de cada procesador. Las cross-call son llamadas que realiza un procesador a otro, 
a modo de interrupciones, para indicarle que debe realizar alguna operación. Las cross-call las suelen utilizar los procesadores
para informar de cambios en las caches de la MMU.

Un número elevado de cross-call puede indicarnos un problema de rendimiento en las caches, de todas formas, el que se produzcan
muchas llamadas de este tipo provocará que los procesadores consuman mucho tiempo atendiendo dichas interrupciones y por lo 
tanto afecten al rendimiento.

DTrace xcall[editar]

# dtrace -n 'sysinfo:::xcalls { @execs[execname] = count(); }'

dtrace: description 'sysinfo:::xcalls' matched 2 probes

bash                                                              3
cron                                                              9
uname                                                            24
sched                                                           219
dtrace                                                        50415

Context switches (csw) e Involuntary context switches (icsw)[editar]

Cambio de contexto voluntario y cambio de contexto involuntario. El número de cambios de contexto dependerá,
principalmente del número de procesos que se estén ejecutando en el sistema, recordemos que un cambio de contexto consiste en 
el proceso por el cual el kernel detiene un proceso que se está ejecutando en un procesador, elije otro proceso de la cola de
ejecución, actualiza los registros del procesador con la información del nuevo proceso y el procesador continua ejecutando el
nuevo proceso en el punto donde fue parado previamente por otro cambio de contexto. 

Cuando el Kernel tiene que elegir un proceso para sacarlo de un procesador, tiene 2 opciones, elegir uno que esté esperando 
un dato de E/S, por ejemplo leyendo de disco, a esto se le llama un cambio de contexto voluntario, es el proceso el que anuncia
que no está haciendo nada en ese instante o elegir uno de los que no están esperando E/S, esto se conoce como cambio de contexto
involuntario.

Si el valor de icsw se bastante superior a csw, podemos decir, que el Kernel está sacando de los procesadores a procesos que
están ejecutando código que no está en un estado de espera, sino que está ejecutando código y que es el propio kernel el que
está ralentizando la ejecución de esos procesos en concreto.

Por otra parte no debemos entender esto como un problema del Kernel, sino más bien, un problema con el número de procesos que se
están ejecutando, debería intentar reducir el factor procesos/CPU, bien bajando el número de procesos, bien aumentando el número
de CPUs.

DTrace csw[editar]

# dtrace -n 'sysinfo:::pswitch { @execs[execname] = count(); }'

dtrace: description 'sysinfo:::pswitch ' matched 3 probes

sshd                                                              2
fmd                                                               3
fsflush                                                           3
sendmail                                                          3
nscd                                                              5
svc.startd                                                        6
dtrace                                                            7
httpd                                                             8
orca                                                           1702
sched                                                          4189

DTrace icsw[editar]

# dtrace -n 'sysinfo::preempt:inv_swtch { @execs[execname] = count(); }'

dtrace: description 'sysinfo::preempt:inv_swtch ' matched 1 probe

dtrace                                                            1
orca                                                             57

Spin on mutexes (smtx)[editar]

Presenta el número de veces que se ha intentado acceder a un mutex y no se ha conseguido en el primer intento. 
Podemos considerar que existe un problema de contención con los mutex, si el valor de smtx es superior a 500 intentos por CPU 
y el valor de sys > usr, esto significaría que el Kernel está consumiendo CPU intentando acceder a una serie de mutex sin
conseguirlo, con loc cual es probable que la tesis de exclusión mutua que está ocurriendo.

La CPU principal (el que toma la interrupción de reloj - por lo general la CPU 0) tienden a tener una lectura alta. 

DTrace smtx[editar]

# dtrace -n 'lockstat:::adaptive-spin, lockstat:::adaptive-block { @execs[execname,probename] = count(); }'

dtrace: description 'lockstat:::adaptive-spin, lockstat:::adaptive-block' matched 2 probes

bash            adaptive-spin                             44
orca            adaptive-spin                            144
sched           adaptive-spin                            527
El comando plockstat también puede ser utilizado para detectar contención a nivel de bloqueos de usuario (plockstat se
utiliza desde DTrace para reunir los eventos de contención)

# plockstat -s 4 -p 336

Mutex block

-------------------------------------------------------------------------------
Count     nsec Lock                         Caller
   12 24816298 libc.so.1`libc_malloc_lock   0

      nsec ---- Time Distribution --- count Stack
   4194304 |@@                      |     1 libc.so.1`lmutex_lock+0xe0
   8388608 |@@@@@@                  |     3 libc.so.1`malloc+0x44
  16777216 |@@@@@@@@                |     4 libc.so.1`__regcomp_C+0x24
  33554432 |@@@@                    |     2 
  67108864 |@@@@                    |     2 

   Mutex unsuccessful spin

   -------------------------------------------------------------------------------
   Count     nsec Lock                         Caller
      16    32768 libc.so.1`libc_malloc_lock   0

    nsec ---- Time Distribution --- count Stack
   32768 |@@@@@@@@@@@@@@@@@@@@@@@@|    16 libc.so.1`lmutex_lock+0xe0
                                          libc.so.1`malloc+0x44
                                          libc.so.1`__regcomp_C+0x24

Interrupts (intr e ithr)[editar]

intr and ithr indican el numero total de interrupciones y el número de interrupciones manejadas como hilos del kernel.

DTrace intr e ithr[editar]

$ intrtime 60 --> Ver DTraceToolkit

 Interrupt         Time(ns)   %Time
      uata          2869846    0.00
       qfe         46331270    0.08 
       glm       1913715146    3.19
TOTAL(int)       1962916262    3.27 
TOTAL(dur)      60008698021  100.00
 
$ /usr/sbin/intrstat 5

device |      cpu0  %tim 
-------------+---------------
glm#0  |       953  2.6 
qfe#0  |       202  1.5 
uata#0 |        91  0.2

Spin sobre read/writer lock (srw)[editar]

Presenta el número de veces que se ha intentado acceder a un lock de tipo lectura/escritura y no se ha conseguido
en el primer intento.

DTrace srw[editar]

# dtrace -n 'lockstat:::rw-block { @execs[execname] = count(); }'

dtrace: description 'lockstat:::rw-block ' matched 1 probe

collect_server       221
orca                 254

System calls (syscl)[editar]

Número de llamadas ejecutadas por cada CPU.

DTrace syscl[editar]

# dtrace -n 'syscall:::entry { @num[execname] = count(); }'

dtrace: description 'syscall:::entry' matched 225 probes

utmpd                                                             2
sac                                                               6
fmd                                                               7
svc.configd                                                       7
ttymon                                                            9
sshd                                                             17
svc.startd                                                       78
sendmail                                                         92
nscd                                                            149
httpd                                                           213
dtrace                                                         2018
orca                                                          70710

The syscall provider can also be used to display the system call along with the executable that issued the call:

# dtrace -n 'syscall:::entry { @num[execname,probefunc] = count(); }'

dtrace: description 'syscall:::entry ' matched 225 probes

orca                          stat64                501
orca                          llseek                610
orca                            read                662
orca                           lseek                666
orca                           gtime               1506
orca                         fstat64               1524

Resumen de DTrace Scripts[editar]

  • Minor faults (minf)
# dtrace -n 'vminfo:::as_fault { @execs[execname] = count() }'
  • Major faults (majf)
# dtrace -n 'vminfo:::maj_fault{ @execs[execname] = count() }'
  • Cross calls (xcall)
# dtrace -n 'sysinfo:::xcalls { @execs[execname] = count(); }'
  • Context switches (csw)
# dtrace -n 'sysinfo:::pswitch { @execs[execname] = count(); }'
  • Involuntary context switches (icsw)
# dtrace -n 'sysinfo::preempt:inv_swtch { @execs[execname] = count(); }'
  • Spin on mutexes (smtx)
# dtrace -n 'lockstat:::adaptive-spin, lockstat:::adaptive-block { @execs[execname,probename]  = count(); }'
  • Interrupts (intr e ithr)
# intrtime 60  --> Ver DTraceToolkit
# /usr/sbin/intrstat 5
  • Spin sobre read/writer lock (srw)
# dtrace -n 'lockstat:::rw-block { @execs[execname] = count(); }'
  • System calls (syscl)
# dtrace -n 'syscall:::entry { @num[execname] = count(); }'
# dtrace -n 'syscall:::entry { @num[execname,probefunc] = count(); }'

Fuentes utilizadas[editar]

http://prefetch.net/articles/dtracecookbook.html