Solucionar un problema relacionado con el rendimiento en el mundo de las TI es siempre un reto y, si no conoce las herramientas adecuadas, resultará frustrante.

Si está trabajando como soporte en un entorno de producción, entonces lo más probable es que tenga que lidiar con problemas relacionados con el rendimiento en el entorno Linux. Repasemos algunas de las utilidades de línea de comandos de Linux más utilizadas para diagnosticar problemas relacionados con el rendimiento.

Nota: Puede que algunos de los comandos listados a continuación no estén instalados por defecto, por lo que tendrá que instalarlos manualmente.

lsof

lsof significa «list open files» (lista de archivos abiertos) para ayudarle a encontrar todos los archivos y procesos abiertos junto con quien los abrió. La utilidad lsof puede ser conveniente de utilizar en algunos escenarios.

Para listar, todos los archivos abiertos por un PID en particular.

# lsof -p PID

Contar el número de archivos y procesos

[root@localhost ~]# lsof -p 4271 | wc -l
34
[root@localhost ~]#

Compruebe el archivo de registro abierto actualmente

# lsof -p | grep log

Averigüe el número de puerto utilizado por el proceso

lsof -i -P |grep $PID
[root@localhost ~]# lsof -i -P |grep 4271

nginx 4271 root 6u IPv4 51306 0t0 TCP *:80 (LISTEN)

nginx 4271 root 7u IPv4 51307 0t0 TCP *:443 (LISTEN)

[root@localhost ~]#

Consulte más ejemplos del comando lsof.

pidstat

pidstat puede utilizarse para monitorizar tareas gestionadas por el núcleo de Linux. Solucionar problemas relacionados con la E/S puede ser fácil con este comando.

Lista las estadísticas de E/S de todos los PID

# pidstat -d

Para desplazar las estadísticas de E/S de un PID en particular

# pidstat -p 4271 -d

Si usted está haciendo la localización de averías en tiempo real para algún proceso, entonces usted puede supervisar el I/O en un intervalo. El siguiente ejemplo es para monitorizar cada 5 segundos.

[root@localhost ~]# pidstat -p 4362 -d 5

Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain) 08/13/2016 _x86_64_ (2 CPU) 

07:01:30 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Comando

07:01:35 PM 0 4362 0.00 0.00 0.00 nginx

07:01:40 PM 0 4362 0.00 0.00 0.00 nginx

07:01:45 PM 0 4362 0.00 0.00 0.00 nginx

07:01:50 PM 0 4362 0.00 0.00 0.00 nginx

top

Probablemente uno de los comandos más utilizados en Linux sería top. El comando top se puede utilizar para mostrar información resumida del sistema y la utilización actual.

La simple ejecución del comando top puede mostrarle la utilización de la CPU, los detalles de los procesos, el número de tareas, la utilización de la memoria, el número de procesos zombis, etc.

top - 11:48:43 up 13 días, 17:25, 1 usuario, carga media: 0.00, 0.00, 0.00
Tareas: 90 en total, 2 en ejecución, 88 durmiendo, 0 paradas, 0 zombis
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1829,7 total, 388,1 libre, 220,3 usado, 1221,4 buff/cache
MiB Swap: 0,0 total, 0,0 libre, 0,0 usado.   1369.4 mem disponibles 

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND       
    1 root 20 0 186820 13400 9092 S 0.0 0.7 0:10.87 systemd       
    2 root 20 0 0 0 S 0.0 0.0 0:00.13 kthreadd        
    3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp      
    4 raíz 0 -20 0 0 I 0.0 0.0 0:00.00 rcu_par_gp          
    6 root 0 -20 0 0 I 0.0 0.0 0:00.00 kworker/0:0H            
    8 root 0 -20 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq            
    9 root 20 0 0 0 S 0.0 0.0 0:07.35 ksoftirqd/0           
   10 root 20 0 0 0 R 0.0 0.0 0:07.30 rcu_sched         
   11 root rt 0 0 0 S 0.0 0.0 0:00.00 migration/0           
   12 root rt 0 0 0 0 S 0.0 0.0 0:00.50 watchdog/0          
   13 root 20 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0       
   15 root 20 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs         
   16 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns     
   17 root 20 0 0 0 S 0.0 0.0 0:00.68 kauditd       
   18 root 20 0 0 0 S 0.0 0.0 0:00.25 khungtaskd          
   19 root 20 0 0 0 S 0.0 0.0 0:00.00 oom_reaper          
   20 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 writeback         
   21 root 20 0 0 0 S 0.0 0.0 0:00.00 kcompactd0          
   22 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd    
   23 root 39 19 0 0 0 S 0.0 0.0 0:05.63 khugepaged          
   24 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 crypto      
   25 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kintegrityd           
   26 root 0 -20 0 0 I 0.0 0.0 0:00.00 kblockd

Para mostrar los detalles del proceso para un usuario específico

# top -u nombredeusuario

Para matar el proceso, puede ejecutar top y pulsar k. Le pedirá que introduzca el PID a matar.

top - 11:49:39 up 13 días, 17:26, 1 usuario, promedio de carga: 0.00, 0.00, 0.00
Tareas: 91 en total, 1 en ejecución, 90 durmiendo, 0 paradas, 0 zombis
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1829,7 total, 386,9 libre, 221,4 usado, 1221,4 buff/cache
MiB Swap: 0,0 total, 0,0 libre, 0,0 usado.   1368.3 mem disponibles 
PID para señalar/destruir [pid por defecto = 21261] 
  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND       
 5834 nginx 20 0 148712 7428 4800 S 0.0 0.4 0:02.37 nginx

ps

ps significa estado del proceso y es un comando muy utilizado para obtener una instantánea del proceso en ejecución. Muy útil para averiguar si un proceso se está ejecutando o no y si se está ejecutando entonces imprime el PID.

Para averiguar el PID y los detalles del proceso por alguna palabra

[root@lab ~]# ps -ef|grep nginx
root 5833 1 0 May24 ? 00:00:00 nginx: proceso maestro /usr/sbin/nginx
nginx 5834 5833 0 May24 ? 00:00:02 nginx: proceso worker
root 21267 18864 0 11:50 pts/0 00:00:00 grep --color=auto nginx
[root@lab ~]#

tcpdump

Solucionar problemas de red es siempre un reto, y uno de los comandos esenciales a utilizar es tcpdump.

Puede utilizar tcpdump para capturar los paquetes de red en una interfaz de red.

Para capturar los paquetes en una interfaz de red en particular

[root@lab ~]# tcpdump -i eth0 -w /tmp/capture
tcpdump: escuchando en eth0, tipo de enlace EN10MB (Ethernet), tamaño de captura 262144 bytes
^C9 paquetes capturados
16 paquetes recibidos por el filtro
0 paquetes descartados por el núcleo
[root@lab ~]#

Como puede ver arriba se ha capturado el flujo de tráfico en la interfaz eth0.

Para capturar el tráfico de red entre la IP de origen y la IP de destino

# tcpdump src $IP y dst host $IP

Capturar el tráfico de red para el puerto de destino 443

# tcpdump dst puerto 443
tcpdump: tipo de enlace de datos PKTAP
tcpdump: salida verbose suprimida, utilice -v o -vv para la decodificación completa del protocolo
escuchando en pktap, tipo de enlace PKTAP (Packet Tap), tamaño de captura 262144 bytes
12:02:30.833845 IP 192.168.1.2.49950 > ec2-107-22-185-206.compute-1.amazonaws.com.https: Banderas [.], ack 421458229, win 4096, longitud 0
12:02:32.076893 IP 192.168.1.2.49953 > 104.25.133.107.https: Flags [S], seq 21510813, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 353259990 ecr 0,sackOK,eol], length 0
12:02:32.090389 IP 192.168.1.2.49953 > 104.25.133.107.https: Flags [.], ack 790725431, win 8192, length 0
12:02:32.090630 IP 192.168.1.2.49953 > 104.25.133.107.https: Flags [P.], seq 0:517, ack 1, win 8192, length 517
12:02:32.109903 IP 192.168.1.2.49953 > 104.25.133.107.https: Banderas [.], ack 147, win 8187, longitud 0

Lea el archivo capturado

# tcpdump -r nombrearchivo

Ejemplo: para leer un archivo capturado anteriormente

# tcpdump -r /tmp/prueba

Obtenga más información sobre tcpdump para capturar y analizar el tráfico de red.

iostat

iostat significa estadísticas de entrada-salida y se utiliza a menudo para diagnosticar un problema de rendimiento con los dispositivos de almacenamiento. Puede monitorizar el informe de utilización de la CPU, el dispositivo y el sistema de archivos de red con iostat.

Visualizar las estadísticas de E/S del disco

[root@localhost ~]# iostat -d
Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain) 13/08/2016 _x86_64_ (2 CPU)
Dispositivo: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.82 55.81 12.63 687405 155546
[root@localhost ~]#

Mostrar estadísticas de la CPU

[root@localhost ~]# iostat -c
Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain) 13/08/2016 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
           0.59 0.02 0.33 0.54 0.00 98.52
[root@localhost ~]#

ldd

ldd significa list dynamic dependencies (lista de dependencias dinámicas ) para mostrar las bibliotecas compartidas que necesita la biblioteca. El comando ldd puede ser útil para diagnosticar el problema de arranque de la aplicación.

Si algún programa no se inicia debido a que las dependencias no están disponibles, entonces puede ldd para averiguar las bibliotecas compartidas que está buscando.

[root@localhost sbin]# ldd httpd
            linux-vdso.so.1 => (0x00007ffe7ebb2000)
            libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fa4d451e000)
            libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fa4d42f9000)
            libaprutil-1.so.0 => /lib64/libaprutil-1.so.0 (0x00007fa4d40cf000)
            libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fa4d3e98000)
            libexpat.so.1 => /lib64/libexpat.so.1 (0x00007fa4d3c6e000)
            libdb-5.3.so => /lib64/libdb-5.3.so (0x00007fa4d38af000)
            libapr-1.so.0 => /lib64/libapr-1.so.0 (0x00007fa4d3680000)
            libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa4d3464000)
            libdl.so.2 => /lib64/libdl.so.2 (0x00007fa4d325f000)
            libc.so.6 => /lib64/libc.so.6 (0x00007fa4d2e9e000)
            liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fa4d2c79000)
            /lib64/ld-linux-x86-64.so.2 (0x00007fa4d4a10000)
            libuuid.so.1 => /lib64/libuuid.so.1 (0x00007fa4d2a73000)
            libfreebl3.so => /lib64/libfreebl3.so (0x00007fa4d2870000)
[root@localhost sbin]#

netstat

netstat(Estadísticas de red) es un comando popular para imprimir conexiones de red, estadísticas de interfaz y para solucionar diversos problemas relacionados con la red.

Para mostrar las estadísticas de todos los protocolos

# netstat -s

Puede utilizar grep para averiguar si hay algún error

[root@localhost sbin]# netstat -s | grep error
   0 errores de recepción de paquetes
   0 errores de búfer de recepción
   0 errores de búfer de envío
[root@localhost sbin]#

Para mostrar la tabla de enrutamiento del núcleo

[root@localhost sbin]# netstat -r
Tabla de enrutamiento IP del núcleo
Destino Puerta de enlace Genmask Banderas MSS Ventana irtt Iface
puerta de enlace predeterminada 0.0.0.0 UG 0 0 0 eno16777736
172.16.179.0 0.0.0 255.255.255.0 U 0 0 0 eno16777736
192.168.122.0 0.0.0 255.255.255.0 U 0 0 0 virbr0
[root@localhost sbin]#

Explore más ejemplos de comandos netstat.

gratis

Si su servidor Linux se está quedando sin memoria o simplemente quiere averiguar cuánta memoria disponible hay, el comando free le ayudará.

[root@localhost sbin]# free -g
             total utilizada libre compartida buff/cache disponible
Mem:             5 0 3 0 1 4
Swap: 5 0 5
[root@localhost sbin]#

g significa mostrar los detalles en GB. Así que como puede ver la memoria total disponible es de 5 GB y 3 GB están libres.

sar

sar(Informe de actividad del sistema) será útil para recopilar una serie de un informe incluyendo CPU, Memoria, y la carga del dispositivo.

Con sólo ejecutar el comando sar le mostrará la utilización del sistema durante todo el día.

sar-output

Por defecto, almacena el informe de utilización en 10 minutos. Si necesita algo más breve en tiempo real, puede utilizarlo como se indica a continuación.

Mostrar informe de CPU por 3 veces cada 3 segundos

[root@localhost sbin]# sar 3 2
Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain) 13/08/2016 _x86_64_ (2 CPU)
11:14:02 PM CPU %user %nice %system %iowait %steal %idle
11:14:05 PM all 1.83 0.00 0.50 0.17 0.00 97.51
11:14:08 PM todas 1.50 0.00 0.17 0.00 0.00 98.33
Media: all 1.67 0.00 0.33 0.08 0.00 97.92
[root@localhost sbin]#

Mostrar informe de uso de memoria

# sar -r

Mostrar informe de red

# sar -n TODOS

ipcs

ipcs(InterProcess Communication System) proporciona un informe sobre el semáforo, la memoria compartida y la cola de mensajes.

Para listar la cola de mensajes

# ipcs -q

Para listar los semáforos

# ipcs -s

Para listar la memoria compartida

# ipcs -m

Para mostrar el estado de uso actual de IPC

[root@localhost sbin]# ipcs -u

------ Mensajes Estado --------
colas asignadas = 0
cabeceras utilizadas = 0
espacio utilizado = 0 bytes

------ Estado de la memoria compartida --------
segmentos asignados 5
páginas asignadas 2784
páginas residentes 359
páginas intercambiadas 0
Rendimiento de swap: 0 intentos 0 éxitos

------ Estado del semáforo --------
matrices utilizadas = 0
semáforos asignados = 0
[root@localhost sbin]#

ioping

ioping es un comando externo que puede instalar desde aquí. Puede ser muy útil para monitorizar la latencia de E/S del disco en tiempo real.

Conclusión

Espero que los comandos anteriores le ayuden en diversas situaciones en su trabajo de administración de sistemas. Los comandos arriba mencionados son buenos para usarlos bajo demanda. Sin embargo, si necesita monitorizar servidores Linux todo el tiempo entonces debería considerar el uso de software de monitorización de servidores.

Y, para aprender más sobre el rendimiento de Linux, puede consultar este curso Udemy.