viernes, 13 de enero de 2012

Unix (IV) .Monitorizando el sistema con lsof

Como indicamos en la última entrada, en esta entrega vamos a hacer un desglose de algunas de las opciones útiles de cara a detectar cuellos de botella en el sistema del comando lsof.
Este comando , permite generar un listado informativo acerca de los descriptores de ficheros asociados a uno o varios procesos. Esto entronca con la filosofía de Unix en la que el principio es que todo lo que hay en el sistema es un fichero

Ilustración 1. Man lsof v.4.76. Plataformas sobre las que existe versión de lsof

Mediante este comando, podemos, entre otras cosas,
  • Verificar los procesos que generan un fichero específico
  • Comprobar las conexiones TCP abiertas por un proceso
  • Localizar los descriptores de fichero de varios procesos simultáneamente.
Sin embargo, un vistazo a la ayuda incluida en sistemas operativos como Solaris o HP-UX acerca del comando lsof no produce muchas certezas, sino más bien una expresión de desconcierto notable. Por ejemplo ,en Solaris 2.9, vemos que el man de dicho comando tiene una extensión de 3696 líneas (3432 en HP-UX v 11.23) , frente a las 726 del comando ps o las 594 de netstat.

Debido a la complicación del comando, he llegado a ver cómo se usa el comando pfiles como la “versión del pobre” a la hora de encontrar en qué puertos están escuchando procesos https://gist.github.com/227926

Sin embargo, dada la versatilidad de lsof, es más interesante hacer un breve recorrido por algunas de las opciones que permite dicho comando y una breve descripción de su utilidad. En este caso, sólo voy a adaptar la documentación que conseguí años ha en http://www.physiol.ox.ac.uk/Computing/Online_Documentation/lsof-quickstart.txt


Hemos de recordar también que la ejecución del comando lsof sobre procesos o sistemas de ficheros requiere de operaciones privilegiadas. Tanto en el sentido de tener permisos sobre dichos procesos o ficheros , como en el uso de operaciones de sistema a bajo nivel en el núcleo del mismo. Lo cual si que puede afectar a la estabilidad y rendimiento del sistema


Ejecución de lsof.
Localización de los procesos que tienen ficheros abiertos en un sistema de ficheros
$lsof /FILESYSTEM

Ilustración 2. ejecución de lsof sobre un sistema de ficheros

Número de descriptores de fichero abiertos por un proceso

$lsof –p PID

Lógicamente, esto se combina con la limitación de descriptores definidos para un sistema

Ilustración 3. Ejecución de lsof para averiguar el número de descriptores de fichero abiertos por un proceso

Podemos observar las sesiones abiertas en terminal (TYPE CHR , /dev/pts/6) por el proceso con PID buscado

Descriptores abiertos por un grupo de programas/ instancias de un servidor

$lsof – c CADENA_TEXTO

Hace operaciones suma lógica sobre distintas opciones , con -a

$lsof –p PID –au USER :

Lista los descriptores de fichero usados por un protocolo

$lsof –i

Ejemplo:

$lsof –i tcp
Ilustración 4. Ejecución lsof .Descriptores de fichero asociados al protocolo TCP
Podemos extender esto a las conexiones abiertas por un proceso específico a un puerto
$lsof -i:ssh
Ilustración 5. Ejecución de lsof sobre un puerto.

Recomendaciones sobre el rendimiento y estabilidad en uso de lsof.

Según se indica en el documento de referencia, el uso del comando lsof posee ciertas opciones recomendables de uso, para evitar que ejecute operaciones que puede afectar a la estabilidad del núcleo

$lsof –b

Asimismo también se puede ejecutar con opciones que permiten mejorar su rendimiento y tiempo de respuesta de cara a operaciones sobre red

$lsof –n : Evita lookups de nombre de host
$lsof –y: evita lookups de nombre de servicio
Nuestra próxima entrega:De lo global a lo sumamente especifico: sar y ptruss