viernes, 6 de abril de 2012

Vmstat Linux (ejemplos) - Herramientas de monitoreo por línea de comandos


Estadísticas de memoria virtual (Virtual memory stats)

Primero debo aclarar algunos puntos sobre el análisis de performance o de las herramientas para evaluar el rendimiento de un equipo, en este caso Linux (espero hacerlo lo propio para Unix, por lo menos Oracle Solaris, OpenSolaris, OpenIndiana, que los conozco muy bien):
1.- Hoy en día primero tienes un histórico del comportamiento de un equipo con herramientas como: Nagios y Cacti (esto provee la radiografiá general de la maquina en gráficos bonitos, algo asi como cuando vas a un medico y este te dice, estas sufriendo de x cosa, ahora debes ir a un especialista).
2.- Una herramienta como vmstat no se lee columna por columna, recorrí rápidamente en google colocando vmstat linux (sobre la busqueda) y la mayoría traduce lo que tiene el manual, eso es importante pero es como cuando tomas una pieza de arte (una pintura) y miras la parte central y dices: "que feo este dibujo", cuando lo que debes mirar es lo que trata de comunicar el artista.
3.- Una herramienta como el vmstat no se debe usar sola, existen otras como mpstat, sar, iostat, top, que según sea el caso nos van a permitir ir dilucidando que pasa en distintos niveles con la aplicación que molesta.
4.- Si usted no sabe que es un proceso bloqueado, que es un proceso en espera, que es un context switch (cambio de contexto), memoria swap, se le va a hacer casi imposible leer la obra de arte delante de sus ojos, yo les dejo unas de esas definiciones aquí:
Proceso Bloqueado (blocked): Por otras aplicaciones.
cs=Context switch= Cambio de contexto, cuando el proceso A debe dejar el procesador por que le toca al proceso B, se debe guardar el estado de ese proceso hasta que le toca A, ese guardado es en memoria.
5.- Usted siente que por mas que lo mira y lo vuelve a mirar le falta algo, llame a un experto, ellos lo van a asesorar por que viven mirando esos cuadros y les es muy fácil empezar a identificar que pasa, pero por favor no crea que el trabajo es fácil y que eso lo hace cualquiera que tenga un curso de Performance.

Ahora la tipica salida del vmstat y primero que significa cada línea, por aquí les dejo el man en ingles, la explicación la adapto un poco para no expertos:

vmstat 2
procs -----------memory----------     ---swap--      -----io---- -system--           ----cpu----
r b     swpd      free   buff   cache     si     so         bi bo        in       cs             us   sy id wa
0 0    214148 82348 41932 299140  1     2         13 25        121    29            25  4  70  1
0 1    212148 82932 41932 301536  670 0         670 0        968    1168        38  4  53  6
2 0    209640 78440 41940 301324  782 0         782 80      1070  1215        34  4  56  5
0 0    209596 74692 42136 301680  64    0        220 16      1015  1721        29  5  59  7
1 0    209580 68004 42136 301940  0      0       12     0       1015   1154       30  3  66  1
^C

Primero,que nada el número que acompaña el vmstat es el número de segundos en el que tendras la recolección, segundo, la primera fila no se debe tomar en cuenta para un análisis, esta generalmente es un acumulado desde que se encendió la maquina.

Procs:
r (run queue): Número de procesos esperando por procesador
b (blocked): Procesos que estan bloqueados, osea que dieron paso a otros procesos para que se continue su ejecucion.

Memory:
swapped: Cantidad de procesos completos pasados (swapped) a disco.
free: Cantidad de memoria física desocupada (no usada), libre para ser usada.

Swap:
si (swapping in): Cantidad de memoria pasada desde disco a memoria (el proceso se llama swapping).
so (swapping out): Cantidad de memoria pasada a disco desde memoria (el proceso se llama swapping).

IO (In/Out):
bi (block in): Bloques recibidos desde un dispostivo de bloque (recordemos que la estructura del disco trabaja en bloques de 8192b, 512b o como lo hayamos definido).
bo (block out): Bloques recibidos hacia un dispostivo de bloque.

System:
in (interruptions): Interrupciones por segundo, incluido los ticks del reloj del procesador (para que puedas ver como se manejan las interrupciones, ejecuta el vmstat y mueve rapidamente el mouse, ahora mira la columna, el sistema operativo cuenta cada movimiento tuyo del mouse, asi como el pulsar teclas, etc).
cs (context switch): Número de cambios de contexto (context switch) por segundo (un proceso debe dejar el procesador para darle paso a otro proceso, por gasto de su quantum por ejemplo, aqui lo ves reflejado).

CPU:
us (user): Gasto de procesos en espacio usuario (todos los procesos de aplicaciones de usuarios, desde una base de datos, hasta un navegador).
sy (system): Gasto de porcesos en espacio kernel (todo con lo que forma el sistema operativo base).
Id (idle): Tiempo en que el procesador esta sin ser usado (100% significa que el procesador no tiene carga, 20%, hay un 80% de procesos que lo estan ocupando).
wa: Tiempo de espera para I/O (ejemplo porcesos esperando para ser copiados en disco duro, pasados a memoria, etc).

Ahora un ejemplo de como analizar el big picture y no solo las columnas.
De la imagen anterior podemos decir que esta maquina tiene poca cantidad de ram libre (columna free en memory), podemos decir que no hay muchos procesos que estén corriendo (us, sy), que el procesador posee el 100% de su capacidad sin uso actualmente.


Esta gráfica tiene muchos procesos que están siendo ejecutados en espacio usuario, el procesador esta a su máxima capacidad (idle 0%), hay una gran cantidad de procesos que están en cola, esperando por el procesador (run queue 31) la memoria no presenta mayor estrés (192MB de RAM libres antes, ahora 185MB), no son procesos por lo que se ve que ocupen el manejo en disco (bi, bo serenos).

Todos los procesos pasan a ser atendidos, bajando rápidamente la cantidad de cambios de contexto (podemos decir que eran procesos sin mayor cantidad de  información que requirieran un uso muy fuerte de la memoria y que el procesador pudo atenderlos velozmente), al poco tiempo vemos que todo regresa a la normalidad, si por el contrario el valor fuera constante (los procesos  que se estaban corriendo, no muy estresantes) habría que observar al procesador con otras herramientas (mpstat es una opción), ya que este no estaría funcionando de forma adecuada entonces.

Ahora un caso de estrés de la memoria en el equipo:
Acá podemos observar como hay procesos que están siendo ejecutados en espacio kernel (columna sy), se ven procesos que si consumen algo de memoria y que esperan ser atendidos por el procesador (run queue), con un continuo alto valor en cambios de contextos y el procesador esta siendo usado a su maxima expresión (idle 0%), si en este equipo no se estan ejecutando scripts para estresarlo (este caso la salida fue provocada), sino por el contrario se están usando procesos en los que no generan un mayor estrés en la maquina, si toca que hagamos un estudio mas profundo de que esta pasando y seguramente descubriríamos que este procesador no es suficiente para la carga de trabajo que se le esta exigiendo.

Espero estos análisis les ayuden a ir creando los suyos.

Como siempre a la orden.

Enjoy.