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!

lunes, 5 de diciembre de 2011

UNIX (II).Configuración de sistema.

En este artículo, vamos a desglosar la organización y estructura general de la configuración de los sistemas Unix. No es nuestro objetivo –entro otras cosas, por el tiempo y espacio que conllevaría- el describir exhaustivamente cada comando, pero si dar algunas pistas sobre
  • Su localización
  • utilidad
  • variaciones según versiones (si aplica)
No obstante, estaremos atentos a los comentarios que genere este artículo, por si hay peticiones del público que podamos atender.
Comúnmente, las instalaciones de sistema operativo UNIX que vienen con un entorno más o menos normalizado, distribuyen sus sistemas de ficheros en
/ ->”raiz” , contiene los ejecutables de sistema en /sbin
/usr -> Directorio software de usuario.
/home -> directorios asignados a los usuarios
/var -> “variable “.Aquí se suelen dejar los logs de administración del sistema
/opt ->“optional” .Aquí se suelen instalar los productos de terceros ,como las BBDD, los binarios de web..etc
Aunque esta distribución dependerá del criterio del departamento de sistemas, suele ser bastante aproximado a la mayor parte de instalaciones, así como una buena idea para poder operar con los sistemas de ficheros, ampliando el espacio de disco asignado o incluyendo volúmenes adicionales.
Como bien sabe cualquier que haya administrado en alguna ocasión un sistema Unix, los ficheros de configuración de sistema se suelen guardar en el directorio /etc . Dentro de dicho directorio, existen varias carpetas que contiene las configuraciones específicas de partes imprescindibles de sistema
  • Arranque del sistema rc,rc.0,…,rc.6
  • Red y comunicaciones inetd.conf ,iptables,services, named.conf
  • Compartición de ficheros : samba
  • Sistemas de ficheros: vfstab
  • Planificación de tareas :cron.d
Nuevamente, hay variaciones entre sistemas, puesto que los fabricantes de los mismos, decidieron en su momento, optar por definir una configuración específica. Por ejemplo
Configuración:Arranque del sistema
El arranque de un sistema Unix Solaris o Linux se organiza en el siguiente árbol de directorios
/etc ->rc.d
rc.1
rc.2
rc.3
rc.4
rc.5
rc.6
Mientras que en un sistema HP-UX 11, sólo tiene un directorio
/etc/rc,
Y la organización de los programas en los niveles de arranque están en
/sbin/>rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
Recordamos que los niveles de configuración especifican los niveles de concurrencia y disponibilidad que permite el sistema en el arranque (rc.X) ,sustituyendo la X por :
0->; Ninguno, indica apagado del sistema
1-> Modo monousuario , consola para verificación de sistema
2-> Modo multiusuario sin red
3-> A partir de aquí, el sistema empieza a funcionar correctamente
4-> Reservado para personalizar, sino igual que el 3
5-> Inicia en modo gráfico (startx o “las X” )
6-> Indica el reinicio del sistema
También se presentan diferencias entre las versiones de Solaris superiores a la 10 y anteriores, ya que la configuración de los demonios que se arrancan , se definen en /etc/services para la versión 10 , mientras que las versiones anteriores utilizan dicho fichero para especificar los puertos utilizados por los distintos demonios
La organización de los niveles de arranque tiene estabulados los ficheros de manera que ,en cada nivel , se puedan especificar qué programas o servicios arrancar
rc.0 : Contiene los scripts de parada de los servicios de sistema ( o específicos) que se quieran detener de manera organizada en la parada
rc.1: el juego de mínimo servicios o demonios para hacer el sistema funcional para un operador en consola
rc.2..rc.5 : Tal y como hemos dicho , se indican los servicios necesarios para cada nivel de sistema, de acuerdo con la categorización del cuadro anterior
Ilustración 1. Fichero de configuración services en Sun OS v 2.8
Según Linux RedHat, este fichero y la asignación de puertos y servicios, sigue para esta distribución el orden especificado por la IANA (Internet Assigned Numbers Authority).
Configuración: En los límites de la capacidad
Existen una serie de valores que pueden actuar como cuellos de botella en la capacidad de los procesos lanzados por el sistema operativo Unix. Descriptores de ficheros, tamaño de pila, tamaño de cores son parámetros a tener en cuenta para la ejecución o depuración de procesos
El comando ulimit, nos permite conocer la configuración de descriptores de fichero asociados, tamaño de pila correspondientes a cada proceso en ejecución de un usuario.
También permite especificar un tamaño máximo para los cores, consumo de CPU, heap asociado a procesos lanzados de usuario. Se pueden establecer límites “soft” y “hard”, dependiendo de los parámetros de llamada del comando ulimit.
  • Soft : Únicamente es válido para la sesión en la que se modifican los límites, no afectando a otras concurrentes ni a una nueva
  • Hard: Se expande por todas las sesiones y queda configurado en las nuevas, por defecto.
Configuración: Internet con red.
Algunos de los ficheros más importantes para un sistema Unix hoy en dia se encuentran aquí. Son los que permiten establecer un sistema de dominio por nombres (DNS) , servidor de ficheros , conectividad segura…etc
Para configurar el servicio de nombres de dominio,el fichero que debe ser modificado es el /etc/named.conf
El correo, es uno de los servicios proporcionado por los sistemas Unix que tiene mayor variación entre versiones . Según qué fabricante o distribuidor , podemos encontrar múltiples variaciones ,pero casi todos ellos con una cosa en común: son difíciles de narices.
Como ejemplos de ficheros de configuración podemos citar el fichero maild.conf y sendmail.conf . Existen distribuciones comerciales y de libre distribución cuya facilidad de configuración las hacen más asequibles a los usuarios menos avezados (Postoffice ,por ejemplo)
La compartición de sistemas de ficheros con otros equipos mediante el protocolo SMB, que permite la utilización de unidades compartidas de Windows, se configuran mediante los ficheros ubicados en /etc/samba
  • smbusers : configuración de usuarios
  • smbpasswd: claves cifradas de usuarios
  • smb.conf: mapeos,directorios…

En los sistemas linux, la configuración de la red se puede realizar mediante el comando ifconfig , que permite establecer la configuración de red , con su máscara de red, Gateway o puerta de enlace por defecto …etc
La configuración de discos en volúmenes con el producto Veritas Manager, de manera que se establezcan conjuntos de discos en espejo o RAID de distintos niveles, se encuentra en el fichero /etc/vfstab.conf
La planificación de tareas, con los servicios clásicos de Unix, se efectúa mediante la configuración del demonio crontabd. Los ficheros que se usan para dicha gestión se encuentran en /etc/crontab
En la próxima entrega trataremos acerca de la monitorización específica:más allá del "top" y del "ps" ,hay vida...