Monitoreo en linux: top

Mi idea original era hacer un post con un resumen de los comandos de Linux que pueden ser utilizados para diagnosticar algún problema de CPU, memoria o I/O; generalmente este conjunto de comandos está formado por top, iostat, vmstat, netstat, telnet, tail de algún log, cat/grep de algún archivo, y algún otro. Cuando empecé a escribir el post empezó quedar enorme, así que voy a separarlo en pedazos, y hacer algo así como una serie de posts sobre este tema.

El comando top nos provee una vistá dinámica y en tiempo real con la cantidad y estado de los procesos corriendo actualmente, memoria, espacio de swap y los recursos utilizados por cada proceso.

La interfaz es actualizada cada cierto período de tiempo (por defecto, 3segundos). Despliega un resumen del estado del sistema y una lista de los procesos corriendo, de la siguiente manera:

<br />
top - 16:26:10 up  2:53,  1 user,  load average: 0.01, 0.01, 0.00<br />
Tasks:  46 total,   2<br />
running,  44 sleeping,   0 stopped,   0 zombie<br />
Cpu(s):  0.3%us,  0.3%sy,  6.0%ni, 93.0%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Mem:    252692k total,   248656k used,     4036k free,    19440k buffers<br />
Swap:   506036k total,       44k used,   505992k free,   188384k cached</p>
<p>  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND<br />
 3365 p2p       39  19 42560  21m 4716 S  6.3  8.9   3:32.54 mlnet<br />
 4076 root      20   0  2324 1120  888 R  0.3  0.4   0:00.11 top<br />
    1 root      20   0  1656  496  456 S  0.0  0.2   0:00.38 init<br />
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd<br />
    3 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0<br />
    4 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 events/0<br />
    5 root      15  -5     0    0    0 S  0.0  0.0   0:00.03 khelper<br />
  163 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kblockd/0<br />

Resumen del estado del sistema

En la primer línea tenemos la fecha y hora actual, la cantidad de
usuarios utilizando el sistema y la carga del sistema del último minuto, de los últimos 5 minutos y de los últimos 15 minutos respectivamente. Cómo se calcula el load average es un tema en sí mismo, pero básicamente es el promedio de la cantidad de procesos corriendo o prontos para correr en cierto período de tiempo.

Lo que tenemos que saber que a mayor load average, mayor uso de procesador. Un load average de 0 indica que el procesador ha sido muy poco utilizado en ese período de tiempo, mientras que si es mayor, significa que hay más procesos corriendo y prontos para correr que lo que el(los) core(s) pueden procesar. Un load average igual a la cantidad de cores indica un uso óptimo del CPU.  Más info acá y acá.

En la segunda línea (Tasks) tenemos la cantidad de procesos y una agregación según el estado de cada uno. Los diferentes estados que muestra son los siguientes:

  • Running: procesos corriendo actualmente, o listos para correr en cuanto se les asigne tiempo de CPU.
  • Sleeping: el proceso está dormido esperando que ocurra un evento para volver al estado “running”.
  • Stopped: La ejecución del proceso está parada; no está corriendo, y no va a volver a correr. Los procesos generalmente entran en este estado cuando reciben señales que no están manejando, y la acción por defecto de las mismas es pasar el proceso a stopped. Esto incluye señales como SIGSTOP, SIGTSTP, SIGTTIN, y SIGTTOU. Una señal de tipo SIGCONT saca al proceso de este estado (ver el comando fg). Con Ctrl+Z mandamos el proceso corriendo en la terminal al background, pasando a estado stopped.
  • Zombie: El proceso tampoco está corriendo. Los procesos quedan en este estado cuando su el proceso que los inició murió, ya sea por un error de programación o porque fue matado (ver kill -9).

La tercera línea nos da los
porcentajes de uso de procesador, discriminado por “tipo” de uso. Los diferentes tipos significan lo siguiente:

  • us: tiempo de procesos de usuario
  • sy: tiempo de procesos del sistema (kernel)
  • ni: tiempo de procesos del usuario que tienen un “nice” positivo
  • wa: tiempo en el cual los procesos están esperando por pedidos de I/O pendientes.
  • id: tiempo “idle”, en que no hay procesos requiriendo tiempo de procesador, y tampoco hay pedidos de I/O pendientes.
  • st: “steal time”, sólo aplica cuando nuestro Linux corre en una máquina virtual. Es el tiempo que algún proceso de nuestro sistema estaba esperando en la cola de ejecución, pero el hypervisor eligió no darnos tiempo de procesador, y asignarlo a otro procesador virtual.

Si presionamos la tecla ‘1’, top nos muestra las estadísticas de uso discriminado por cada core/procesador:

<br />
top - 18:57:22 up 12 days,  5:09,  1 user,  load average: 0.03, 0.03, 0.00<br />
nTasks: 174 total,   1 running, 173 sleeping,   0 stopped,   0 zombie<br />
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Cpu2  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Cpu4  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />

La línea siguiente (Mem) detalla las estadísticas de uso de memoria. En ella vemos la memoria total, la memoria utilizada, la memoria libre y la memoria utilizada por como buffers.
Mem:    252692k total,   248656k used,     4036k free,    19440k buffers

La última de las líneas del
resumen (Swap) detalla el uso del espacio de swap. Indica cuánto es el espacio de swap total, cuánto está utilizado, cuánto libre y cuánto está siendo utilizado por páginas cacheadas
Swap:   506036k total,       44k used,   505992k free,   188384k cached

Lista de procesos

Luego del resumen del uso de los recursos del sistema top lista los procesos activos, ordenándolos según el uso de procesador.

Las columnas tienen el siguiente significado:

  • PID: Process ID
  • USER: usuario que inició el proceso
  • PR: prioridad del proceso
  • NI: nice value. Un valor negativo significa mayor prioridad (hasta -20), un valor positivo, menor prioridad (hasta 19)
  • VIRT: Cantidad de memoria virtual utilizada por el proceso (incluyendo datos, código, shared libraries y swap)
  • RES: Cantidad de memoria RAM física que el proceso está utilizando
  • SHR: Cantidad de memoria compartida.
    Refleja la memoria que potencialmente podría ser compartida con otros procesos.
  • S: Status del proceso. Los posibles estados son ‘D’ (uninterruptible sleep), ‘R’ (running), ‘S’ (sleeping), ‘T’ (traced o stopped) o ‘Z’ (zombie).
  • %CPU: porcentaje de CPU utilizado desde la última actualización de la pantalla.
  • %MEM: porcentaje de memoria física utilizada por el proceso
  • TIME+: Tiempo total de CPU que el proceso ha utilizado desde que se inició.
  • COMMAND: comando utilizado para iniciar el proceso.

Se pueden agregar, quitar o cambiar el orden de estas columnas con las teclas f y o.

Interacción con top

Podemos utilizar las siguientes teclas para interactuar con top:

  • M – Ordenar por uso de memoria
  • P – Ordenar por uso de CPU
  • T – Ordenar por tiempo de CPU utilizado
  • F – seleccionar campo por el cual ordenar la lista de procesos
  • i  – mostrar u ocultar procesos idle y zombie
  • m, l, t, 1 – muestra u oculta las líneas del resumen (parte de arriba)
  • f, o – agregar/quitar columnas, cambiar el orden
  • s – cambia el tiempo de actualización de la pantalla (por defecto, 3 segundos)
  • z – Colores
  • k – Matar un proceso (luego pregunta el PID)
  • r – “renice” cambia el nice value de un proceso (luego pregunta el PID)
  • q – finalizar
  • h – ayuda

Hay algunas más, que se pueden ver en la ayuda del comando o en las man pages.

Referencias

Audio y video en Java utilizando ffmpeg, Jffmpeg, y JMF

Introducción

Supongamos que queremos implementar un reproductor multimedia en Java. Si a priori no conocemos los codecs de audio o video que debemos soportar, o si simplemente no existe una implementación de ese codec en Java, podemos interactuar con ffmpeg para reproducir multimedia en un montón de formatos diferentes. Para ello podemos utilizar JMF, Jffmpeg del lado del “mundo Java” interactuando con ffmpeg del lado del “mundo nativo”.

ffmpeg es una solución muy completa, open source y multi plataforma para grabar, convertir y reproducir audio y video. El proyecto está licenciado bajo LGPL o GPL (dependiendo de la configuración).

JMF (Java Media Framework) es una API  que permite agregar audio y video a nuestras aplicaciones y applets implementadas sobre tecnología Java. Además de reproducir, JMF nos permite
capturar, transcodificar o hacer streaming en varios formatos.

Jffmpeg es el puente entre ffmpeg y JMF. Si bien JMF soporta algunos formatos, eventualmente nos cruzaremos con el mensaje de error «Unable to handle format:…», especialmente al intentar reproducir los formatos más nuevos. Este plugin de JMF un wrapper Java que utiliza JNI para hacer las llamadas directas al código nativo de ffmpeg.

Instalación en Linux

Vamos a instalar y configurar las diferentes partes de la solución para poder reproducir video en Linux. Quizá el post tienda a compilar todo y configurar “a mano”, es debido a que documenta la necesidad de reproducción de pautas publicitarias en un NLPOS, un flavour de Linux de Novell bastante recortado y orientado a puntos de venta.

1. Instalación de ffmpeg

Como primer punto, compilaremos e instalaremos ffmpeg a partir del código fuente. Tenemos varias opciones: hacer un checkout de SVN, hacer un GIT clone,
o bajarnos el código de la última versión estable. Para cualquier opción, contamos con lo que necesitamos aquí.

Es una buena idea instalar codecs externos para luego poder integrarlos con ffmpeg. Entre estos codecs externos tenemos a LAME para MPEG Audio Layer III,  AMR para 3GPP y xvid para los estándares MPEG-4 Simple Profile and Advanced Simple Profile.

La primer parte de este link nos muestra cómo instalar los diferentes tanto los codecs externos como ffmpeg.

Para la instalación más básica, sin codecs externos, basta con hacer un

./configure

en el directorio en donde está ubicado el código de ffmpeg, luego un

make

y finalmente, con permisos de root un

make install

En distribuciones de Linux más “modernas”  seguramente tengamos la opción de instalar ffmpeg desde repositorios de paquetes, sin la necesidad de compilarlo a mano.

2. Instalación de JMF

JMF no tiene mucha ciencia para instalarlo, simplemente bajamos el instalador de aquí y lo corremos en el directorio que queramos instalarlo. Yo lo ejecuté desde /usr/lib para que JMF quede en /usr/lib/JMF-2.1.1e/ (llamaremos ${JMF_HOME} al directorio de instalación), pero no repercute en el funcionamiento. Debemos recordar que ${JMF_HOME}/lib/jmf.jar deberá estar en el classpath de nuestra aplicación.

3. Instalación de Jffmpeg

Jffmpeg tampoco da muchas dificultades para instalarlo. Podemos bajar el JAR y el .so (o .dll) de aquí, y descomprimirlos en el directorio que nos resulte más cómodo. Lo que debemos tener en cuenta después, es que el JAR deberá estar
en el classpath de nuestra aplicación, y el .so en LD_LIBRARY_PATH, o configurado en el path de las librerías de Linux.

Llamaremos ${JFFMPEG_HOME} al directorio en donde tenemos el JAR y el .so.

4. Classpath, LD_LIBRARY_PATH, etc.

Tanto las librerías nativas como los JARs de JMF y Jffmpeg deberán estar referenciadas por nuestra aplicación para ser tenidas en cuenta.

Para los JARs basta con agregarlos a una variable de entorno que luego se referenciará en el classpath de nuestra aplicación.

Para las librerías nativas podemos agregar un archivo de extensión conf en /etc/ld.so.conf.d/ que contenga una línea para cada directorio que deba ser considerado al buscar las librerías.

La otra opción es agregar los directorios a la variable de entorno LD_LIBRARY_PATH. Esta variable contiene una lista de directorio separados por coma, la cual es utilizada por el sistema operativo para buscar librerías antes de recurrir al conjunto predeterminado de directorios.

Si no queremos definir este conjunto de variables a mano, podemos editar el archivo ~/.bashrc agregando las siguientes líneas (quizá las rutas no sean las que correspondan):

<br />
# cat ~/.bashrc</p>
<p>export JMF_HOME=/usr/lib/JMF-2.1.1e<br />
export JFFMPEG_HOME=/root/jffmpeg<br />
export CLASSPATH=$ JMF_HOME /lib/jmf.jar:$JFFMPEG_HOME/jffmpeg-1.1.0.jar:.:$CLASSPATH<br />
export LD_LIBRARY_PATH=$ JMF_HOME /lib:$JFFMPEG_HOME:${LD_LIBRARY_PATH}<br />
export JAVA_HOME=/usr/java/jdk1.6.0_14<br />

5. Registro de los codecs

Para agregar los codecs de Jffmpeg en JMF utilizaremos la herramienta JMFRegistry que viene con el Java Media Framework. Podemos ejecutarlo por consola tipeando “java JMFRegistry” o desde las preferencias del JMStudio, otra herramienta de JMF que hace de Media Player.

Para cada cambio que listamos a continuación, debemos hacer clickear el botón de commit.

En la pestaña de “Mime types” registramos las siguientes extensiones:

  1. video/vob -> vob
  2. audio/ogg -> ogg

Bajo la pestaña “
Plugins” registramos los siguientes “Demultiplexers”:

  1. net.sourceforge.jffmpeg.demux.vob.VobDemux
  2. net.sourceforge.jffmpeg.demux.ogg.OggDemux

Y bajo la pestaña “Codec” registramos los siguientes codecs:

  1. net.sourceforge.jffmpeg.VideoDecoder
  2. net.sourceforge.jffmpeg.AudioDecoder

6. Parámetros de la aplicación

Como último paso, debemos recordar agregar ya sea la variable $CLASSPATH al classpath de nuestra aplicación, o cada JAR por separado (${JMF_HOME}libjmf.jar,   ${JFFMPEG_HOME}jffmpeg-1.1.0.jar).

Conclusión

Si bien no es “soplar y hacer botellas”, en Java tenemos la posibilidad de agregar contenido multimedia a nuestras aplicaciones o applets utilizando la potencialidad que nos dan los codecs implementados como código nativo al sistema operativo.

En este post vimos un ejemplo en instalación y configuración en Linux; la configuración en Windows no es demasiado diferente.

Referencias

http://jffmpeg.sourceforge.net/download.html

http://downloads.xvid.org/downloads/xvidcore-1.2.2.tar.bz2

http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/download.html

http://www.ffmpeg.org/

http://jffmpeg.sourceforge.net/

http://www.hiteshagrawal.com/ffmpeg/installing-ffmpeg-easily-on-linux

http://www.elctech.com/articles/installing-ffmpeg-with-faac-and-x264-encoders-from-source-on-ubuntu

http://www.luniks.net/luniksnet/html/java/jtvd/doc/jmf.html

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Cheat sheets

En http://www.cheat-sheets.org/ tenemos una colección de hojas de referencia sobre un montón de tecnologías, sistemas operativos, bases de datos, entre otros. Están buenas para tener alguna impresa para pegarle un vistazo si no queremos «googlear» algún detalle particular.

Listo algunas de las más interesantes:

.NET

.NET Format String Quick Referencee
Core C# and .NET Quick Reference by Stephen C. Perry [pdf] (digilife.be)
C# and VB.NET Comparison Cheat Sheet by Steven Swafford [pdf] (aspalliance.com)

CVS

CVS Quick Reference Card Andrew Ford [pdf] (refcards.com)

Design patterns

Design Patterns Quick Reference by Jason S. McDonald [pdf] (mcdonaldland.info)

Eclipse

Eclipse Keyboard Shortcuts by Jesper Kamstrup Linnet [pdf, rtf] (eclipse-tools.sourceforge.net)

FTP

List of FTP commands for the Microsoft command-line FTP client (nsftools.com)

Linux

Unix/Linux Command Cheat Sheet by Jacob [pdf] (fosswire.net)
Linux Administrator’s Quick Reference by Jialong He [pdf] (tiger.la.asu.edu)
The One Page Linux Manual by Squadron [pdf] (homepage.powerup.com.au/~squadron/, digilife.be)

MySQL

MySQL Cheat Sheet by Dave Child [png, pdf] (addedbytes.com)
MySQL cheatsheets by Bob Stein, VisiBone [two wall posters 43cmx61cm or 61cmx87cm, jpg] (visibone.com)
MySQL Cheat Sheet (nparikh.org)
MySQL Database Quick Reference by DeepX [pdf] (tiger.la.asu.edu)

OpenSSH

OpenSSH Configuration Quick Reference by Jialong He [pdf] (tiger.la.asu.edu)

Firefox

Keyboard Shortcuts (mozilla.org)

SQL

SQL in one page (sql.su)

SQL Server

SQL Server Cheat Sheet by Dave Child [png, pdf] (addedbytes.com)

Subversion

Subversion Cheat Sheet by Dave Child [pdf] (addedbytes.com)
Subversion Quick Reference Card by Cezary Sobaniec [pdf] (cs.put.poznan.pl)

UNIX

UNIX BASH shell Quick Reference by Arnold Robbins [pdf] (tiger.la.asu.edu)

XML

XML 1.0 Syntax Quick Reference by Mulberry Technologies, Inc. [pdf] (mulberrytech.com)

XPath y XSLT

XSLT 1.0 and XPath 1.0 Quick Reference [pdf] (mulberrytech.com)
XPath by DeepX Ltd [pdf] (refcards.com)

Actualización 24-Nov-2009

Agrego una colección de 25 cheat sheets de diseño web, PHP, WordPress, Photoshop, etc. que me pareció interesante: 34 cheat sheets for web designers and developers