miércoles, 14 de diciembre de 2011

Unix III:Monitorizando sistemas

Como el lector ya habrá visto, este es un blog especializado en pruebas de rendimiento y calidad. Por lo que en esta entrega del serial del Unix, vamos a mostrar una pequeña guía de comandos de monitorización específicos.
Introducción.
Habitualmente, las monitorizaciones realizadas durante las pruebas de carga, deben de incluir monitorizaciones sobre
- El estado global de la máquina
- Estado específico de los procesos que dan servicio a la aplicación
- Estado de las comunicaciones
Las monitorizaciones se pueden realizar
  • bien mediante una herramienta específica de terceros (léase Introscope, HP Diagnostics) las cuales permiten monitorizar tanto global, como especializadamente la máquina y procesos asociados. Tienen el problema de ser herramientas de pago y que precisan de la instalación de “sondas” ,agentes e incluso una infraestructura específica.
  • Mediante comandos del sistema operativo. Esto permite realizar monitorizaciones sin gasto adicional , ni infraestructuras específicas, aunque tiene limitaciones y precisan en ocasiones de permisos mediante sudo
Tanto las herramientas externas, como los comandos generan un consumo adicional en las máquinas a monitorizar. Es conveniente por lo tanto, ejecutar estos comandos en intervalos adecuados a la duración de la prueba para tomar medidas sin que afecten en demasía al comportamiento del sistema durante la ejecución.

Memoria compartida.
Habitualmente dentro de la categoría de monitorización mediante comandos usamos clásicos como vmstat o ps ,bien formateado para generar valores específicos (ps –eo PID,PPID,pcpu,rss,args ) o mediante parámetros de ejecución específicos de una versión de ps (ps –aux).
Sin embargo, tenemos algunas limitaciones con métricas recogidas por este comando, como por ejemplo, el comportamiento de la memoria asociada a un proceso, cuando se comparte memoria entre distintos procesos de una instancia de Oracle.
En estos casos, vemos que la memoria que refleja un ps sobre uno de dichos los procesos, muestra la suma total de la memoria compartida (RSS).
Ilustración 1. Salida del comando ps con cadena de formato
En este caso, monitorizado sobre un proceso con PID específico (7076), nos indica que, el campo RSS ocupa 597880 KBytes. Esta memoria es la compartida por todos los procesos de la instancia de Oracle.

Sin embargo, podemos usar el comando pmap, el cual nos indica de manera desglosada el consumo de memoria compartida, y los permisos que se tiene sobre cada página de la memoria asociada el proceso. Sin embargo, este es un comando privilegiado, que sólo puede ejecutar el usuario que está lanzando el proceso que se quiere monitorizar


$ sudo -u /bin/pmap -x 7076
7076: oracleIESECFI0 (LOCAL=NO)
Address Kbytes RSS Anon Locked Mode Mapped File
0000000100000000 51992 50312 - - r-x-- oracle
00000001033C4000 720 680 64 - rwx-- oracle
0000000103478000 504 392 160 - rwx-- [ heap ]
0000000380000000 544768 544768 - 544768 rwxsR [ ismhmid=0x1000032 ]
FFFFFFFF7D100000 64 64 32 - rwx-- [ anon ]
FFFFFFFF7D200000 640 192 - - r-x-- libm.so.2
FFFFFFFF7D300000 16 16 16 - rw--R [ anon ]
FFFFFFFF7D350000 80 80 40 - rw--R [ anon ]
FFFFFFFF7D366000 40 40 32 - rw--R [ anon ]
FFFFFFFF7D39E000 40 24 8 - rwx-- libm.so.2
FFFFFFFF7D400000 56 16 - - r-x-- libmd.so.1
FFFFFFFF7D50E000 8 8 - - rwx-- libmd.so.1
FFFFFFFF7D600000 24 24 - - r-x-- libm.so.1
FFFFFFFF7D704000 8 8 8 - rwx-- libm.so.1
FFFFFFFF7D800000 8 8 - - r-x-- libkstat.so.1
FFFFFFFF7D902000 8 8 - - rwx-- libkstat.so.1
FFFFFFFF7DA00000 32 24 - - r-x-- librt.so.1
FFFFFFFF7DB08000 8 8 8 - rwx-- librt.so.1
FFFFFFFF7DC00000 32 32 - - r-x-- libaio.so.1
FFFFFFFF7DD08000 8 8 8 - rwx-- libaio.so.1
FFFFFFFF7DE00000 944 760 - - r-x-- libc.so.1
FFFFFFFF7DF00000 64 32 24 - rwx-- [ anon ]
FFFFFFFF7DFEC000 64 64 48 - rwx-- libc.so.1
FFFFFFFF7DFFC000 8 8 8 - rwx-- libc.so.1
FFFFFFFF7E000000 8 8 - - r-x-- libdl.so.1
FFFFFFFF7E102000 8 8 8 - rwx-- libdl.so.1
FFFFFFFF7E200000 32 16 - - r-x-- libgen.so.1
FFFFFFFF7E308000 8 8 - - rwx-- libgen.so.1
FFFFFFFF7E400000 56 40 - - r-x-- libsocket.so.1
FFFFFFFF7E500000 8 8 8 - rwx-- [ anon ]
FFFFFFFF7E50E000 16 16 16 - rwx-- libsocket.so.1
FFFFFFFF7E600000 688 272 - - r-x-- libnsl.so.1
FFFFFFFF7E700000 8 8 8 - rwx-- [ anon ]
FFFFFFFF7E7AC000 64 64 48 - rwx-- libnsl.so.1
FFFFFFFF7E7BC000 32 32 8 - rwx-- libnsl.so.1
FFFFFFFF7E800000 5384 1704 - - r-x-- libjox9.so
FFFFFFFF7EE00000 8 8 8 - rwx-- [ anon ]
FFFFFFFF7EE40000 376 280 112 - rwx-- libjox9.so
FFFFFFFF7EE9E000 16 - - - rwx-- libjox9.so
FFFFFFFF7EF00000 32 24 - - r-x-- libskgxn9.so
FFFFFFFF7F000000 8 8 8 - rwx-- [ anon ]
FFFFFFFF7F006000 8 8 - - rwx-- libskgxn9.so
FFFFFFFF7F100000 8 8 - - r-x-- libskgxp9.so
FFFFFFFF7F200000 8 8 - - rwx-- libskgxp9.so
FFFFFFFF7F300000 8 8 - - r-x-- libodmd9.so
FFFFFFFF7F400000 8 8 8 - rwx-- libodmd9.so
FFFFFFFF7F500000 24 16 8 - rwx-- [ anon ]
FFFFFFFF7F600000 176 176 - - r-x-- ld.so.1
FFFFFFFF7F700000 8 8 8 - rwx-- [ anon ]
FFFFFFFF7F72C000 16 16 16 - rwx-- ld.so.1
FFFFFFFF7F78C000 8 8 - - rwxs- [ anon ]
FFFFFFFF7FFF0000 64 64 40 - rw--- [ stack ]
---------------- ---------- ---------- ---------- ----------
total Kb 607224 600408 760 544768


Tabla 1. Salida del comando pmap sobre un proceso de Oracle
Podemos ver que la columna “Locked mode” indica el modo de acceso al segmento de memoria indicado. En este caso, debemos fijarnos sólo en aquellos valores de la columna que sean
  • rwx-
  • rw---
El valor de la columna que incluya el campo “s”, indica memoria “shared” ,es decir, compartida.
El resto de columnas de la muestra, reflejan memorias de uso compartido con el resto de procesos lanzados de la instancia de Oracle a la que pertenece.
Como idea, un posible script para sacar la monitorización de memoria usada en exclusiva por un proceso sería

sudo -u USUARIO /bin/pmap -x $1 | grep -v Address | awk ' BEGIN {
primero=1
}
/:/ {
if(primero==1) {
primero=0;
} else {
print “tiempo,"$1, proc, ",", suma;
}
suma=0;
proc=$0;
}
$6 !~ /s/ {
if (($6 =="rw---") || ($6 =="rwx--"))
suma=suma+$3;
}
END {
print “tiempo,”,$1,proc,",",suma;
}'
Donde USUARIO sería el usuario que ejecuta el proceso a monitorizar y $1 el pid del proceso.


Threads en Solaris.Siguiendo el hilo
La monitorización específica de procesos también puede extenderse al uso de los threads activos . Para ello un comando útil bajo Unix (versión Solaris) es prstat

Ilustración 2. Salida del comando prstat sobre un usuario ($prstat -u hzweb)
El comando admite varias opciones de ejecución , dependiendo de si se quiere
  • monitorizar un proceso/s específico/s $ prstat –p PIDLIST
  • monitorizar los procesos lanzados por un/os usuario/s $ prstat –U UIDLIST
  • monitorizar los threads (en Solaris “Light weight processes”) en ejecución ($ prstat –L –U UIDLIST –p PIDLIST
Este último caso es quizás el más interesante para observar el comportamiento de todos los threads asociados al proceso. Ya que el número de threads asociados puede superar el tamaño de líneas del terminal , lo ideal es lanzar el comando con alguna de las opciones de ordenación que permiten establecer
También podemos conocer el número total de threads asociados, usando la opción “-t” con el comando
$ prstat -t -L -U UIDLIST

Ilustración 3.Salida del comando prstat sobre procesos de dos usuarios
El comando que se puede usar para conocer cuáles son los hilos que están consumiendo más recurso de procesador (opción “-s cpu)” y en qué CPUs físicas
$ prstat –L –p PID –s cpu

Ilustración 4.Salida del comando prstat sobre los threads de un proceso de usuario

La columna STATE permite distinguir los procesos en ejecución en un procesador determinado (cpuN), en cola de ejecución (run) en espera (sleep) o, llegado el caso desechados (zombi) o parados (stop).
En resumen ,este comando, nos permite observar

  • Número de threads asociados a un proceso
  • Consumo desglosado por thread
  • Balanceo y distribución de los threads en un sistema multiprocesador
  • Bloqueos presentes en los threads

Con estos valores, podemos por lo tanto detectar si un sistema gestionan adecuadamente los hilos de ejecución de una JVM y sus consumos asociados (por ejemplo ,en un servidor weblogic o SunOne )
En la próxima entrega tratermos sobre la localización de los procesos que generan elevado consumo de espacio en disco (lo cual afecta decisivamente al rendimiento) ,así como el agotamiento de descriptores de fichero: lsof. ¡El comando con el manual incomprensible!

No hay comentarios:

Publicar un comentario