Herramientas de diagnóstico


troubleshooting-pic.jpg

Cuantas veces tuvimos problemas con nuestra maquina o un server. Aquella falla extraña que nos vuelve loco y no sabemos por donde empezar.
En este documento les voy a mostrar una serie de herramientas que nos va a permitir encontrar el problema y tomar las medidas correctivas necesarias.

Aplicaciones que fallan
Strace:
Esta herramienta nos permite hacer un seguimiento (trace) de las llamadas del sistema (system Calls) de una aplicación. Una llamada del sistema es una función del kernel que nos da acceso seguro a recursos del sistema como memoria, disco y red.
El método para utilizarlo es muy simple. Simplemente le pasamos como parámetro el nombre de la aplicación.
Lo mejor es ver como funciona con un ejemplo
Por ejemplo supongamos que tenemos totem y con todos los codecs instalados y al querer ver un DVD nos aparece un error informando que falta una librería.
Para saber que librería es:
Simplemente corremos lo siguiente:
strace totem
La salida va a ser muy grande. Lo mejor es direccionarlo a un archivo para luego analizarlo.
strace -o salida.txt totem
Si analizamos el archivo de texto veremos algo asi:
# Output of strace on totem
open(“/etc/ld.so.cache”, O_RDONLY)      = 26
fstat64(26, {st_mode=S_IFREG|0644, st_size=58317, …}) = 0
old_mmap(NULL, 58317, PROT_READ, MAP_PRIVATE, 26, 0) = 0xb645e000
close(26)
access(“/etc/ld.so.nohwcap”, F_OK)      = -1 ENOENT (No such file or directory)

open(“/lib/tls/i686/cmov/libdvdcss.so.2″, O_RDONLY) = -1 ENOENT (No such file or directory)
stat64(“/lib/tls/i686/cmov”, {st_mode=S_IFDIR|0755, st_size=1560, …}) = 0

stat64(“/lib/i486-linux-gnu”, 0xbfab4770) = -1 ENOENT (No such file or directory)
munmap(0xb645e000, 58317)               = 0
open(“/usr/lib/xine/plugins/1.1.1/xineplug_inp_mms.so”, O_RDONLY) = 26
read(26, “\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\27″…, 512) = 512
fstat64(26, {st_mode=S_IFREG|0644, st_size=40412, …}) = 0

Presten atención a lo siguiente:
open(“/lib/tls/i686/cmov/libdvdcss.so.2″, O_RDONLY) = -1 ENOENT (No such file or directory)
Esta linea se compone esencialmente de un nombre de llamada al sistema, los argumentos al llamado entre paréntesis y el status. El status para un error generalmente es -1, pero a veces varia.
Noten también que strace muestra el status “errno”. Si no estan familiarizados con programación en UNIX, errno es una variable global que toma valores específicos cuando un comando se ejecuta. Para mayor información hagan un man errno. Strace nos mostrara una descripción por cada valor de errno, por ejemplo en este caso ENOENT (No such file or directory).

Strace tiene opciones bastante interesantes por ejemplo con la opción -e podemos especificar que llamadas del sistema queremos hacer un seguimiento por ejemplo:
strace -o salida.txt -e trace=open,close totem
En este caso obtendremos solamente las llamadas open() y close() que hace el programa.

ltrace:
Esta aplicación a diferencia de strace hace un seguimiento de las llamadas a las librerías dinámicas. Solamente se utiliza en el caso de necesitar el seguimiento de alguna función de una librería dinámica muy especifica como ser malloc(), gethostbyname(), and setenv().

ldd:
Muy útil en el caso de querer saber a que librerías llama determinado programa.
Ejempo:
ldd /usr/bin/mc
linux-gate.so.1 =>  (0xffffe000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x4de92000)
libgpm.so.1 => /usr/lib/libgpm.so.1 (0x4f47b000)
libslang.so.2 => /lib/libslang.so.2 (0x4f4b5000)
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0x4e436000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x4e709000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x4e83a000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x4e83f000)
/lib/ld-linux.so.2 (0x4de7a000)

lsof:
Muestra los archivos abiertos del sistema.  Es realmente útil a la hora de averiguar que archivos determinado proceso tiene abierto o que procesos estan realizando alguna acción sobre determinado archivo.
Veamos algunos ejemplo:
cuantas veces tratan de desmontar un cd-rom y les aparece la leyenda “device or resource is busy”.
Simplemente corran el siguiente comando:
lsof /dev/cdrom
Nos listara los procesos que estan utilizando el recurso.
Luego procedemos a matarlos con un kill PID y podremos desmontar la unidad sin problemas.
Otra utilidad es ver que procesos tiene abierto determinado usuario:
lsof -u pepe
Ver que archivos estan abiertos de determinando proceso:
lsof -p PID
también podemos ver quien esta conectado a nuestro equipo en un determinado rango de puertos:
lsof -i @192.168.0.2:1-1024

Analizando la memoria y el uso del procesador
Top: esta herramienta nos sirve para ver que procesos estan corriendo en memoria.
indica el uso de memoria de cada proceso, además de CPU, puede ser nuestro mejor aliado y en tiempo real.
Ejmplo de la salida de top:

top – 19:36:27 up 13 min,  2 users,  load average: 0.84, 0.68, 0.49
Tasks:  85 total,   1 running,  84 sleeping,   0 stopped,   0 zombie
Cpu(s): 14.0% us,  1.7% sy,  0.0% ni, 76.3% id,  7.3% wa,  0.7% hi,  0.0% si
Mem:    483812k total,   478728k used,     5084k free,    74692k buffers
Swap:   658624k total,        0k used,   658624k free,   166176k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
4104 root      15   0 93016  20m 8248 S 11.0  4.3   0:36.14 Xorg
5161 sebastia  15   0 51676  15m 9996 S  4.0  3.3   0:02.38 gnome-terminal
4796 sebastia  16   0  4244 1672 1272 S  0.7  0.3   0:01.60 conky
5184 sebastia  16   0  2200 1036  828 R  0.7  0.2   0:00.15 top
1 root      16   0  1564  496  432 S  0.0  0.1   0:01.08 init
2 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
4 root      10  -5     0    0    0 S  0.0  0.0   0:00.11 events/0
5 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 khelper
6 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthread
8 root      10  -5     0    0    0 S  0.0  0.0   0:00.38 kblockd/0
9 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 kacpid
120 root      15   0     0    0    0 S  0.0  0.0   0:00.05 pdflush
121 root      15   0     0    0    0 S  0.0  0.0   0:00.02 pdflush
122 root      15   0     0    0    0 S  0.0  0.0   0:00.08 kswapd0
123 root      19  -5     0    0    0 S  0.0  0.0   0:00.00 aio/0
710 root      10  -5     0    0    0 S  0.0  0.0   0:00.02 kserio
Presten atención a los procesos que consumen mucha memoria y CPU.
Tambien a Load Average o carga del sistema que son los 3 primeros valores.
La carga mínima de un sistema es de 0 y la máxima es ilimitada, aunque raramente excede de 20, e incluso más de 10 es poco usual. En nuestro caso es menos de 1 significa que el sistema esta funcionando muy bien.

Free:
nos permite ver la memoria libre y utilizada del sistema:
Ejemplo de salida:

total       used       free     shared    buffers     cached
Mem:        483812     473980       9832          0      72240     153732
-/+ buffers/cache:     248008     235804
Swap:       658624       6036     652588

En primer lugar, entendamos cómo se gestiona la memoria física del sistema en Linux. El kernel tiende a tomar, primeramente, la memoria que necesitan los procesos que corre. Conforme el sistema está en marcha más tiempo, el kernel toma prácticamente la totalidad de la memoria física existente, dejando solamente unos cuantos MB de memoria físicamente libres. Muchas veces esto lleva a los principiantes en Linux a confusión, llegando a creer que la gestión de la memoria que hace Linux no es eficiente.

¿Y para qué usa esa memoria restante Linux? La usa como buffers, esto es, guarda datos para un más rápido acceso al disco, datos de programas que se abrieron, por si se vuelven a abrir, que se invierta mucho menos tiempo en ello, etc. En definitiva, aprovecha la memoria físicamente libre para agilizar tareas básicas.

En el ejemplo es un sistema con 512 MB de ram (32 MB usado por memoria de video) de ellos solamente hay libres casi 10MB.
En la línea -/+ buffers/cache tenemos en used  la cantidad de memoria estimada que los procesos del sistema están usando, y en free, la suma de la memoria usada para buffers y caché más la físicamente libre. Así, los procesos sólo están necesitando 24 MB de RAM, y el resto de memoria usada está simplemente agilizando el sistema.

Ahora nos fijamos en la última línea. Ahí tenemos el uso de la partición SWAP de intercambio de datos. Esta es una buena medida para saber lo “cargado” que está nuestro sistema. En este caso hay escritos menos de 6 MB en la memoria SWAP, lo que pone de manifiesto que la máquina anda holgada.

Sar:
System activity report, esta herramienta se encuentra tanto en la mayoria de los *nix como en Linux. En Linux especificamente en el paquete sysstat. Posee una serie de utilidades que nos permiten capturar informacion y producir detallados reportes. Es util para diagnosticar posibles cuellos de botella y medir la utilizacion del sistema durante determinado tiempo.
Ejemplo:
Para obtener un reporte basico de utilizacion de CPU y de tiempo de espera entreda/salida (I/O wait time) correr simplemente sar sin ningun argumento. Obtendremos la siguiente salida:
01:10:00 PM       CPU     %user     %nice   %system   %iowait     %idle
01:20:00 PM       all      7.78      0.00      3.34     20.94     67.94
01:30:00 PM       all      0.75      0.00      0.46      1.71     97.08
01:40:00 PM       all      0.65      0.00      0.48      1.63     97.23
01:50:00 PM       all      0.96      0.00      0.74      2.10     96.19
02:00:00 PM       all      0.58      0.00      0.54      1.87     97.01
02:10:00 PM       all      0.80      0.00      0.60      1.27     97.33
02:20:01 PM       all      0.52      0.00      0.37      1.17     97.94
02:30:00 PM       all      0.49      0.00      0.27      1.18     98.06
Average:          all      1.85      0.00      0.44      2.56     95.14
Si el valor de %idle es cercano a 0 significa que la CPU esta sobrecargada. Si %iowait tiene valores muy altos significa que el o los discos estan sobrecargados.

Si quieren ver la performace del paginado del kernel utilicen el siguiente comando:
sar -B
Obtendrán una salida como la siguiente:
11:00:00 AM  pgpgin/s pgpgout/s   fault/s  majflt/s
11:10:00 AM      8.90     34.08      0.00      0.00
11:20:00 AM      2.65     26.63      0.00      0.00
11:30:00 AM      1.91     34.92      0.00      0.00
11:40:01 AM      0.26     36.78      0.00      0.00
11:50:00 AM      0.53     32.94      0.00      0.00
12:00:00 PM      0.17     30.70      0.00      0.00
12:10:00 PM      1.22     27.89      0.00      0.00
12:20:00 PM      4.11    133.48      0.00      0.00
12:30:00 PM      0.41     31.31      0.00      0.00
Average:       130.91     27.04      0.00      0.00

Si ven valores altos en el campo majflt/s indica que el sistema necesita mas memoria.
Tengan en cuenta que este valor solamente es valido en kernels 2.5 o superior.

Vmstat:
Nos muestra uso de memoria virtual, cpu, y del consumo de entrada salida.
ejemplo de salidas de sistema que funciona en forma optima:
procs ———–memory———- —swap– —–io—- –system– —-cpu—-
r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
1  0  13868  14964  58232 155248    0    0    89    21 1193   556 11  2 83  5

Ejemplo de salida de sistema que tiene mucha carga:
procs ———–memory———- —swap– —–io—- –system– —-cpu—-
r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy id
16  0  0   2360 264400  96672   9400   0   0     0     1   53    24   3   1 96
24  0  0   2360 257284  96672   9400   0   0     0     6 3063 17713  64  36 0
15  0  0   2360 250024  96672   9400   0   0     0     3 3039 16811  66  34 0

Los valores interesantes son los primeros. Este es el numero de procesos que se ecuentran corriendo en la cola. Este valor muestra cuantos procesos estan listos para ser ejecutados, pero que no se pueden ejecutar en este momento debido a que todavia no terminaron los anteriores. En sistemas con poca carga no deben pasar 1-3. Valores superiores a 10 indican que el sistema esta sobrecargado.
Otros valores interesantes son los pertenecientes a los campos in y cs. El valor in indica el numero de interrupciones por segundo del sistema. Un sistema que tiene mucha carga de red o acceso a disco va a presentar valores altos.
El valor cs (context switch) es el numero de cambio de contexto por segundo.
El cambio de contexto se produce cuando el kernel tiene que sacar el codigo ejecutable fuera de la memoria y cambiar a otro. Si hay mucho cambio de contexto es malo, porque va a tomar un numero largo de ciclos de proceso para cambiar el contexto. El sistema se pasa todo el tiempo cambiando trabajos en vez de realmente estar haciendo algo.

Analizando problemas de red: fisico y de transporte

tcpdump:
Nos permite determinar si un servicio no responde porque los paquetes no llegan a la maquina remota. Tengan en cuenta de pasar parametros al comando especialmente si estan diagnosticando logueados en una maquina remota atraves de SSH.

Algunos ejemplos:
tcpdump -l -i eth0 port 25
Esto va a hacer un dump de todos los paquetes que se originan en el puerto UDP o TCP 25. El parametro -l indica que haga line buffering por lo que veremos cada paquete apenas cruce el cable de conexion.
tcpdump -l not port 22
Este es el ejemplo tipico si utilizamos conexion SSH.
tcpdump -l src or dst B.remote.net
Este ejemplo sirve si queremos ver que sucede entre Server A.local.net (corriendo tcpdump) y el server remoto B.remote.net

netstat:
Nos muestra el status de general de conexion hacia un equipo.
Si lo corremos sin parametros nos muestra cada socket abierto en el equipo.
Ejemplos:
netstat -pa
La opcion -p le dice a netstat que trate de determinar que programa tiene el socket abierto.
Para ver que demonios estan corriendo y aceptando conexiones TCP:
netstat -tlpn
Para las conexion UDP seria:
netstat -ulpn
Si lo que deseamos es ver problemas de throughput.
netstat -s
Nos va a brindar informacion detallada sobre el stack de red. Mucho mas que el contador de frames perdidos RX/TX que brinda el comando ifconfig.

ifconfig:
Este comando nos sirve para configurar las placas de red, sin parametros nos va a devolver el status de las mismas.
Ejemplo:

eth0 Link encap:Ethernet HWaddr 00:0C:6E:C1:3A:8A
inet addr:zzzz.xxxx.yyyy.wwww Bcast: zzzz.xxxx.wwww.223 Mask:255.255.255.224
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1734670 errors:0 dropped:0 overruns:0 frame:0
TX packets:2346720 errors:218 dropped:0 overruns:0 carrier:365
collisions:20 txqueuelen:1000
RX bytes:258344392 (246.3 Mb) TX bytes:2444720372 (2331.4 Mb)
Interrupt:10 Base address:0xf000

Si se fijan hay dos errores en este caso que nos deberia preocupar:
carrier:365 errores. Esto normalmente significa que la portadora en el cable que conecta al equipo con el switch, está fallando y está dando errores. Puede deberse normalmente la causa a:

* el cable está dañado,
* el cable está viejo,
* la conexió de los puntos del cable tiene falsos contactos o
* el puerto del switch o de nuestra tarjeta de red están malos

collissions: 20. En un ambiente de red donde se maneje todo a base de switches (lo 100% comun en este momento en las redes) el servidor no debe tener ninguna colisión, por lo tanto hay que aclarar con el datacenter para que no nos pongan en un hub, sino en un switch decente que no genere colisiones.

Disco Rigido: Espacio y problemas fisicos
df:
Muchas veces el problema recide en el espacio en disco y son la causa de fallas en el sistema en general o de las aplicaciones.
Veamos un ejemplo:
df -h
Con este comando vamos a tener una completo reporte de las unidades de disco.
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1              19G  9.0G  8.5G  52% /
varrun                237M   88K  237M   1% /var/run
varlock               237M     0  237M   0% /var/lock
udev                  237M  104K  237M   1% /dev
devshm                237M     0  237M   0% /dev/shm
lrm                   237M   19M  218M   8% /lib/modules/2.6.15-23-386/volatile
/dev/hda2             6.9G  3.1G  3.8G  46% /media/hda2
/dev/hda4              21G  1.8G   19G   9% /media/hda4
Lo recomendable es que la utilizacion del disco este por debajo del 90%.
Muchas veces sucede que al usar el comando df -h nos muestre suficiente espacio en disco y sin embargo no podamos escribir en él. Esto sucede cuando se acaban los inodes. Para saber los inodes disponibles correr el siguiente comando:
df -i
Una salida tipica seria la siguiente:
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/hda1            2443200  150748 2292452    7% /
varrun                 60476      47   60429    1% /var/run
varlock                60476       4   60472    1% /var/lock
udev                   60476     808   59668    2% /dev
devshm                 60476       1   60475    1% /dev/shm
lrm                    60476      21   60455    1% /lib/modules/2.6.15-23-386/volatile
/dev/hda2                  0       0       0    -  /media/hda2
/dev/hda4                  0       0       0    -  /media/hda4

badblocks:
Comando muy simple que nos permite analizar un disco en busqueda de bloques malos.
ejemplo:
badblocks /dev/hda
Si queremos que nos genere un archivo con el reporte de los bloques malos encontrados:
badblocks -o reporte.txt /dev/hda

Smartmon tools:
Este conjunto de herramientas no precisan presentación, ya se hablo sobre este en un articulo anterior. Sumamente util a la hora de diagnosticar fallas fisicas de discos y determinar su reemplazo.

Logs del sistema
La mayoria de las aplicaciones de Linux utilizan la utilidad syslog para exportar los errores y los mensajes de status a archivos ubicados en el directorio /var/log.
Esta informacion es invaluable para detectar y correjir errores del sistema.
Editando el archivo de configuracion /etc/syslog.conf podemos configurar que queremos loguear.

Por ejemplo:
*.debug                    /var/log/messages
Le indicamos al sistema que loguee mensajes de severidad debug en /var/log/messages.
Si el equipo desktop o servidor presenta problemas y cuelgues no es muy seguro registrar los logs en el mismo equipo que presenta problemas. Lo mejor es activar el logueo remoto.
Para ello vamos a modificar el archivo de configuracion /etc/sysconfig/syslog
Ejemplo de configuracion:
# Options to syslogd
# -m 0 disables ‘MARK’ messages.
# -r enables logging from remote machines
# -x disables DNS lookups on messages received with -r
# See syslogd(8) for more details

SYSLOGD_OPTIONS=”-m 0 -r”

# Options to klogd
# -2 prints all kernel oops messages twice; once for klogd to decode, and
#    once for processing with ‘ksymoops’
# -x disables all klogd processing of oops messages entirely
# See klogd(8) for more details

KLOGD_OPTIONS=”-2″

En el caso de Debian/Ubuntu deben editar el script de inicio:
/etc/init.d/sysklogd
Deberia quedar de la siguiente manera:
# Options for start/restart the daemons
#   For remote UDP logging use SYSLOGD=”-r”
#
#SYSLOGD=”-u syslog”
SYSLOGD=”-r”
Luego hacemos un restart del servicio para que tomen efecto los cambios.
Un servidor syslog escucha en el puerto UDP 514
A continacion deben configurar el cliente:
Supongamos que el cliente se llama Xunilda:
Editamos el archivo /etc/hosts y ponemos la informacion del servidor.
ejemplo:
192.168.1.100    server.sitio.com    server     loghost
Por lo que quedara configurado el nickname loghost para el server “server”
Lo siguiente se editar el archivo /etc/syslog.conf para que los mensajes sean enviados al nickname loghost
*.debug                                       @loghost
*.debug                                       /var/log/messages
Hacemos un restart del servicio y probamos:
En el cliente:
root@xunilda tmp]# service lpd restart
Stopping lpd: [  OK  ]
Starting lpd: [  OK  ]
[root@xunilda tmp]#

En el servidor:
[root@server tmp]# tail /var/log/messages


Mar 25 22:09:35 xunilda lpd: lpd shutdown succeeded
Mar 25 22:09:39 xunilda lpd: lpd startup succeeded


[root@server tmp]#

Syslog también tiene reservada facilidades que van de local0 a local7 para poder recibir mensajes de Routers, switches, firewalls y balanceadores de carga cada uno con logueo independiente para poder hacer un diagnostico eficiente.

Conclusión
Como podran ver nuestro querido GNU/Linux tiene muy buenas herramientas para diagnosticar problemas que no tienen nada que envidiarle otras de pago e incluso menos flexibles.
Si bien no se abarcaron todas las que existen intente dar un pantallazo de las principales y que son parte de las herramientas GNU clasicas que estan presentes en cualquier distribución.
El que quiera ampliar simplemente consulten las manpages de cada herramienta presentada.

ESTE TEXTO SE PUBLICA BAJO LICENCIA CREATIVE COMMONS BY-NC-SA 2.5 AR.

Por lo tanto, usted es libre de: 1) Copiarlo, distribuirlo y exhibirlo. 2) Hacer obras derivadas. Bajo las siguientes condiciones: 1) Debe dar atribución mencionando el nombre del autor y del LUG Zona Norte. En caso de las notas que no llevan firma, mencionar sólo el nombre del LUG.
2) Usted no puede usar esta obra con fines comerciales. 3) Si usted altera, transforma, o crea sobre este texto, sólo podrá distribuir la obra derivada resultante bajo una licencia idéntica a ésta.

Más detalles y texto legal de la licencia en: http://creativecommons.org/licenses/by-nc-sa/2.5/ar

  1. #1 by FedeTheGreat on 27/03/2007 - 23:24

    Exlente che muchas gracias ya lo imprimo y lo dejo a mano!

(will not be published)

IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)

What is 5 + 6 ?
Please leave these two fields as-is: