Anexo D: Herramientas de Monitoreo del Sistema - top, htop, etc
Anexo D: Herramientas de Monitoreo del Sistema - top, htop, etc
Introducción
En administración de servidores Linux, monitorear el sistema es fundamental. Necesitas saber:
- ¿Cuánta CPU estoy usando?
- ¿Qué procesos consumen memoria?
- ¿Está saturado el disco?
- ¿Quién se conecta al servidor?
Este anexo enseña herramientas para observar qué está sucediendo en tiempo real en tu servidor.
🗺️ En este anexo aprenderás:
- top - Monitor de procesos clásico (siempre disponible)
- htop - Versión mejorada de top (más amigable)
- free - Información de RAM
- df - Espacio en disco
- du - Uso de disco por carpeta
- iostat - Lectura/escritura de disco
- netstat/ss - Conexiones de red
- vmstat - Estadísticas virtuales de memoria
- Monitoreo remoto y alertas
⏱️ Duración estimada: 60 minutos de práctica
¿Por Qué Estas Herramientas?
Escenario real en Abacom:
3:47 PM - Usuario reporta: "El servidor está lento"
Tu respuesta:
$ top # Ver procesos que consumen CPU
$ free -h # Verificar RAM disponible
$ df -h # Verificar espacio en disco
$ netstat -an | wc -l # Ver conexiones activas
Conclusión: "Hay 10,000 conexiones TCP activas
consumiendo toda la memoria"
Solución: Optimizar aplicación o agregar más RAM
Sin estas herramientas, estarías a ciegas.
💡 Monitoreo en Diferentes SOs
BASH
# Linux tiene todas estas herramientas nativas
$ which top
/usr/bin/top
$ which htop
/usr/bin/htop
$ which free
/usr/bin/free
$ which df
/bin/df
# Monitor de procesos
$ top
$ htop # (si está instalado)
# RAM disponible
$ free -h
total used free
Mem: 15Gi 5.2Gi 8.2Gi
# Espacio en disco
$ df -h
Filesystem Size Used Avail Use%
/dev/sda1 100G 35G 65G 35%
# Conexiones de red
$ ss -an | wc -l
2345BASH
# macOS NO tiene: top, htop, free (igual que Linux)
# Top existe pero funciona diferente
# Free no existe - usar vm_stat en su lugar
# Monitor de procesos (macOS top)
$ top -l 1 # Solo una iteración
$ top # Interactive (diferente a Linux)
# Memoria (no existe 'free', usar vm_stat)
$ vm_stat | grep "Pages free"
Pages free: 2048234 # En páginas de 4KB
# Alternativa: Con Homebrew
$ brew install htop
$ htop # Ahora funciona igual a Linux
# Espacio en disco
$ df -h
Filesystem Size Used Avail Use%
/dev/disk0s2 250G 100G 150G 40%
# Conexiones de red (similar a Linux)
$ netstat -an | wc -l
1234
# Mejor: usar lsof para ver procesos y puertos
$ lsof -i :8080
# Ver qué proceso usa puerto 8080POWERSHELL
# Windows no tiene top, free, df
# Usa Get-Process, Get-PSDrive, etc.
# Monitor de procesos
PS> Get-Process | Sort-Object CPU -Descending | Select-Object Name, CPU, Memory | head -10
Name CPU Memory
---- --- ------
chrome 450.25 2842894336
firefox 125.50 854321120
# RAM disponible
PS> $RAM = Get-WmiObject Win32_ComputerSystem
PS> Write-Host "$($RAM.TotalPhysicalMemory / 1GB) GB total RAM"
16 GB total RAM
# Espacio en disco
PS> Get-PSDrive | Where-Object {$_.Provider -match 'FileSystem'}
Name Used (GB) Free (GB) Provider
---- --------- --------- --------
C 200 50 FileSystem
D 500 100 FileSystem
# Conexiones de red
PS> (Get-NetTCPConnection).Count
2345
# O abrir Task Manager gráficamente
PS> taskmgr # GUI interactivaComparación de comandos: | Tarea | Linux | macOS | Windows | |——|——-|——-|———| | Ver procesos | top / htop | top -l 1 (diferente) | Get-Process | | Ver RAM | free -h | vm_stat | Get-WmiObject Win32_ComputerSystem | | Ver disco | df -h | df -h | Get-PSDrive | | Ver conexiones | netstat -an / ss | netstat -an / lsof -i | Get-NetTCPConnection |
Recomendación para Abacom:
- Linux: Usar herramientas nativas (top, free, df, netstat)
- macOS: Instalar Homebrew y usar
htop,lsof - Windows: Usar PowerShell cmdlets o Task Manager GUI
Concepto 1: TOP - Monitor de Procesos
Ejecutar TOP
BASH
1top- 1
- top abre monitor interactivo de procesos
Pantalla inicial:
top - 15:47:23 up 45 days, 2:34, 3 users, load average: 0.89, 0.76, 0.68
Tasks: 287 total, 2 running, 285 sleeping, 0 stopped, 0 zombie
%Cpu(s): 8.2 us, 3.4 sy, 0.0 ni, 88.1 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15967.5 total, 8234.6 free, 5421.2 used, 2311.7 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 9854.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12847 nginx 20 0 145620 12344 9876 S 8.2 0.1 2:45.32 nginx
8934 mysql 20 0 876543 234567 45678 S 5.6 12.3 45:23.12 mysqld
Entender la Salida de TOP
Primera línea:
top - 15:47:23 ← Hora actual
up 45 days, 2:34 ← Tiempo encendido el servidor
3 users ← Usuarios conectados
load average: 0.89, 0.76, 0.68 ← Carga CPU (1min, 5min, 15min)
“Load average” es crítico:
- 1 core = load 1.0 es 100% ocupado
- 4 cores = load 4.0 es 100% ocupado
- load 0.5 = 50% del CPU disponible
- Si ves load 8.0 en máquina 4-core = SATURADO
Segunda línea - Procesos:
Tasks: 287 total ← Total de procesos
2 running ← Ejecutándose ahora
285 sleeping ← Esperando (normal)
0 stopped ← Detenidos
0 zombie ← Procesos fantasma (problema)
Tercera línea - CPU:
%Cpu(s): 8.2 us ← User Space (código de aplicación)
3.4 sy ← System (kernel Linux)
0.0 ni ← Nice (prioridad baja)
88.1 id ← Idle (desocupado) ← Ideal es ALTO
0.3 wa ← Wait I/O (esperando disco)
0.0 hi ← Hardware interrupts
0.0 si ← Software interrupts
0.0 st ← Stolen (virtualization)
Memoria:
MiB Mem: 15967.5 total ← RAM total
8234.6 free ← Disponible (libre)
5421.2 used ← En uso
2311.7 buff/cache ← Buffer/Cache (puede liberarse)
Columnas de Procesos:
PID ← ID del proceso
USER ← Usuario propietario
%CPU ← Porcentaje de CPU usando
%MEM ← Porcentaje de RAM usando
VIRT ← Memoria virtual (puede no existir)
RES ← Memoria física (RAM real)
COMMAND ← Nombre del proceso
Comandos Interactivos en TOP
Dentro de TOP, presiona:
ESPACIO → Actualizar pantalla
P → Ordenar por %CPU (procesos más pesados)
M → Ordenar por %MEM (más memoria)
T → Ordenar por TIME (más tiempo corriendo)
R → Invertir orden (Mayor a menor)
q → Salir de top
k → Matar proceso (kill)
r → Cambiar prioridad (renice)
f → Agregar/quitar columnas
Ejemplo: Encontrar Proceso que Consume CPU
BASH
# Ejecutar top
top
# Presionar P para ordenar por CPU
# Ver el primero en lista
# Presionar k para matar (si necesitas)
# Ingresar PID del procesoTOP sin Modo Interactivo
BASH
# Ver procesos una sola vez (sin interactivo)
1top -b -n 1- 1
- -b (batch mode) no interactivo, -n 1 una sola actualización
Útil en scripts:
BASH
#!/bin/bash
# Monitorear si PHP consume >80% CPU
top -b -n 1 | grep php | awk '{print $9}' | while read CPU
do
if (( $(echo "$CPU > 80" | bc -l) ))
then
echo "ALERTA: PHP consume ${CPU}% CPU"
# Enviar alerta por email, etc
fi
doneConcepto 2: HTOP - TOP Mejorado
Instalar HTOP
BASH
# Ubuntu/Debian
sudo apt install -y htop
# CentOS/RHEL
sudo dnf install -y htop
# Arch
sudo pacman -S htopEjecutar HTOP
BASH
1htop- 1
- htop es reemplazo directo de top (mismos comandos)
Ventajas sobre TOP:
- ✅ Colores (más legible)
- ✅ Barras de progreso (CPU, Memoria)
- ✅ Scroll horizontal/vertical
- ✅ Buscar procesos (f para filtrar)
- ✅ Ver árbol de procesos (t para tree)
- ✅ Interfaz más amigable
Pantalla de HTOP:
CPU[████████░░░░░░] 45% Tasks: 142, 2 thr; 1 running
Mem[██████████░░░░] 68% Load average: 0.89 0.76 0.68
Swp[░░░░░░░░░░░░░░] 0% Uptime: 45d 2h 34m
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
12847 nginx 20 0 145M 12M 9.8M S 8.2 0.1 2:45 nginx: worker process
8934 mysql 20 0 876M 234M 45M S 5.6 12.3 45:23 /usr/sbin/mysqld
2341 diego 20 0 234M 89M 23M S 2.1 0.6 1:23 firefox
Atajos en HTOP
P → Ordenar por %CPU
M → Ordenar por %MEM
T → Ordenar por TIME
H → Mostrar/ocultar procesos de threads
K → Mostrar/ocultar kernel threads
F → Filtrar procesos (ej: "nginx")
t → Ver árbol de procesos (parent-child)
i → Mostrar solo procesos con I/O
s → Cambiar prioridad (strace)
q → Salir
Concepto 3: FREE - Información de RAM
Ver Memoria en Formato Humano
BASH
1free -h- 1
- -h (human-readable) muestra en GB/MB en vez de bytes
Salida:
total used free shared buff/cache available
Mem: 15Gi 5.3Gi 8.0Gi 234Mi 2.3Gi 9.4Gi
Swap: 4.0Gi 0B 4.0Gi
Interpretar la Salida
Mem: 15Gi ← RAM total instalada
5.3Gi usado ← En uso ahora
8.0Gi libre ← No usado (desocupado)
234Mi shared ← Memoria compartida (múltiples procesos)
2.3Gi cache ← Datos cacheados (puede liberarse)
9.4Gi avail ← Disponible para aplicaciones NEW
Antes Linux 3.14:
Total = Usado + Libre ← Esto era INCORRECTO
Linux 3.14+ (disponible):
Total = Usado + (Cache - usable) + Libre
Avail = Libre + Cache ← Lo que REALMENTE tienes disponible
Monitorear Memoria en Intervalos
BASH
# Mostrar cada 2 segundos
1free -h -s 2- 1
- -s 2 (seconds) actualiza cada 2 segundos
Salida:
total used free shared buff/cache available
Mem: 15Gi 5.3Gi 8.0Gi 234Mi 2.3Gi 9.4Gi
Swap: 4.0Gi 0B 4.0Gi
total used free shared buff/cache available
Mem: 15Gi 5.3Gi 8.0Gi 234Mi 2.3Gi 9.4Gi
Swap: 4.0Gi 0B 4.0Gi
Presiona Ctrl+C para salir.
Concepto 4: DF - Espacio en Disco
Ver Espacio en Disco
BASH
1df -h- 1
- -h (human-readable) en GB/MB
Salida:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 32G 15G 68% /
/dev/sda2 450G 120G 330G 27% /home
/dev/sdb1 500G 480G 20G 96% ⚠️ /mnt/backup
tmpfs 15G 0 15G 0% /dev/shm
Identificar Discos Llenos
BASH
# Mostrar en porcentaje de uso
1df -h | awk '{print $5, $6}' | sort -rn- 1
- awk extrae columnas, sort -rn ordena descendente
Salida:
96% /mnt/backup ← ¡ALERTA! Disco lleno
68% /
27% /home
0% /dev/shm
Alerta si Disco >80% Lleno
BASH
#!/bin/bash
# Script para monitorear discos
df -h | tail -n +2 | while read LINE
do
1 USAR=$(echo $LINE | awk '{print $5}' | sed 's/%//')
MOUNT=$(echo $LINE | awk '{print $6}')
if [ "$USAR" -gt 80 ]
then
echo "⚠️ ALERTA: $MOUNT está al ${USAR}% de capacidad"
fi
done- 1
- sed ‘s/%//’ elimina el signo % para comparar como número
Concepto 5: DU - Uso de Disco por Carpeta
Encontrar Qué Ocupa Espacio
BASH
# ¿Quién está ocupando espacio en /home?
1du -sh /home/*- 1
- -s (summarize) solo total, -h (human) en GB/MB
Salida:
45G /home/diego
23G /home/carlos
8.2G /home/ana
1.5G /home/backup
Encontrar Top 10 Carpetas Más Grandes
BASH
1du -sh /* | sort -rh | head -10- 1
- sort -rh ordena numérico inverso
Salida:
234G /var
120G /home
45G /opt
23G /usr
8.2G /root
4.5G /tmp
2.3G /etc
1.2G /srv
890M /lib
456M /bin
Profundizar en Carpeta
BASH
# ¿Qué hay en /var que ocupa 234G?
du -sh /var/* | sort -rh | head -5
# ¿Qué hay en /var/log?
du -sh /var/log/* | sort -rh | head -5Encontrar carpeta problemática:
BASH
1du -sh /var/log/* | grep "G$"- 1
- grep “G$” solo líneas con G (gigabytes)
Concepto 6: IOSTAT - Lectura/Escritura de Disco
Instalar sysstat
BASH
# Ubuntu/Debian
sudo apt install -y sysstat
# CentOS/RHEL
sudo dnf install -y sysstat
# Arch
sudo pacman -S sysstatVer Actividad de Disco
BASH
1iostat -x 1- 1
- -x (extended) más detalles, 1 actualiza cada 1 segundo
Salida (primera línea muestra promedios):
Device r/s w/s rMB/s wMB/s r_await w_await %util
sda 125.4 45.2 8.3 2.1 12.5 23.4 45.2%
sdb 45.2 10.1 3.2 0.8 8.2 15.1 12.3%
sdc 2.1 1.0 0.1 0.1 45.2 78.9 2.1%
Device r/s w/s rMB/s wMB/s r_await w_await %util
sda 234.1 89.3 15.4 5.2 15.2 34.5 78.9%
sdb 0.0 0.0 0.0 0.0 0.0 0.0 0.0%
sdc 0.0 0.0 0.0 0.0 0.0 0.0 0.0%
Interpretar iostat
r/s ← Lecturas por segundo
w/s ← Escrituras por segundo
rMB/s ← Megabytes leídos por segundo
wMB/s ← Megabytes escritos por segundo
r_await ← Latencia de lectura (ms)
w_await ← Latencia de escritura (ms)
%util ← Porcentaje de utilización
Análisis:
- %util > 80% = Disco saturado
- r_await > 50ms = Lecturas lentas
- w_await > 100ms = Escrituras muy lentas
Concepto 7: NETSTAT/SS - Conexiones de Red
Ver Conexiones Activas
- 1
- ss (socket statistics) es reemplazo moderno de netstat
- 2
- netstat funciona pero deprecado
Opciones:
- t = TCP
- u = UDP
- l = Listen (servicios esperando)
- p = Process (mostrar qué proceso)
- n = Numeric (IP en vez de nombres)
Salida:
State Recv-Q Send-Q Local Address Foreign Address State PID/Program
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 5678/nginx
ESTAB 0 0 192.168.1.100:22 192.168.1.50:45678 ESTAB 9876/sshd
Ver Solo Conexiones TCP Establecidas
BASH
1ss -tn | grep ESTAB | wc -l- 1
- grep ESTAB filtra conexiones establecidas, wc -l cuenta
Salida:
247
Hay 247 conexiones TCP activas.
Encontrar Proceso Usando Puerto
BASH
# ¿Quién está usando puerto 8080?
1ss -tulpn | grep :8080- 1
- grep :8080 busca puerto 8080
Salida:
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* LISTEN 12345/java
Proceso Java con PID 12345 está usando puerto 8080.
💡 Ejemplos Prácticos Reales
Ejemplo 1: Monitoreo Completo del Servidor
Script que muestra salud general:
BASH
#!/bin/bash
# Script de salud del servidor para Abacom
echo "=== MONITOREO DEL SERVIDOR ==="
echo
# CPU y Carga
echo "📊 CPU y Carga:"
top -b -n 1 | head -3
echo
# RAM
echo "💾 Memoria:"
free -h | head -2
echo
# Disco
echo "💿 Disco:"
df -h | grep "^/dev" | awk '{printf "%-15s %6s %6s %6s\n", $1, $3, $2, $5}'
echo
# Procesos por CPU
echo "🔥 Top 3 procesos por CPU:"
top -b -n 1 | head -7 | tail -3
echo
# Procesos por Memoria
echo "🧠 Top 3 procesos por Memoria:"
top -b -n 1 -o %MEM | head -7 | tail -3
echo
# Conexiones de red
echo "🌐 Conexiones TCP activas:"
ss -tn | grep ESTAB | wc -l
echo
echo "✓ Monitoreo completado: $(date)"Uso:
BASH
chmod +x monitor.sh
./monitor.sh
# Salida esperada:
# === MONITOREO DEL SERVIDOR ===
#
# 📊 CPU y Carga:
# load average: 0.89, 0.76, 0.68
# ...Ejemplo 2: Alerta si CPU >80%
BASH
#!/bin/bash
# Alerta si CPU está saturado
LIMITE=80
CPU=$(top -b -n 1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1 | cut -d' ' -f1)
if (( $(echo "$CPU > $LIMITE" | bc -l) ))
then
echo "⚠️ ALERTA: CPU está al ${CPU}%"
# Enviar email, Slack, etc
echo "ALERTA CPU" | mail -s "Servidor saturado" admin@abacom.es
fiEjemplo 3: Dashboard en Tiempo Real
BASH
#!/bin/bash
# Monitoreo continuo en terminal
while true
do
clear
echo "=== MONITOREO EN VIVO ==="
echo "Hora: $(date '+%H:%M:%S')"
echo
# Mostrar top 5 procesos
echo "Top 5 procesos por CPU:"
top -b -n 1 | tail -6
echo
# Mostrar RAM
echo "Memoria (MB):"
free -m | head -2
echo
sleep 2
done📊 Tabla de Referencia Rápida
| Herramienta | Uso | Ejemplo |
|---|---|---|
| top | Monitor procesos interactivo | top |
| htop | Top mejorado con colores | htop |
| free -h | RAM disponible | free -h |
| df -h | Espacio en disco | df -h |
| du -sh | Uso por carpeta | du -sh /home/* |
| iostat -x 1 | I/O del disco | iostat -x 1 |
| ss -tn | Conexiones TCP | ss -tn |
| vmstat 1 | Estadísticas VM | vmstat 1 10 |
🎓 Quiz: Verificar Comprensión
a) CPU está al 40%
b) Hay 4 procesos ejecutándose
c) En máquina 4-core = CPU 100% ocupado (Correcto ✓)
d) Sistema necesita 4 GB más RAM
Explicación: Load 1.0 por core = 100% uso. En máquina 4-core, load 4.0 = saturado.
a) Son iguales
b) “Usado” incluye cache que puede liberarse. “Disponible” es realmente free (Correcto ✓)
c) “Disponible” es más pequeño siempre
d) “Usado” no cuenta swap
Explicación: Antes “Usado + Libre = Total”. Ahora Linux 3.14+ muestra “Disponible” que es lo que realmente puedes usar.
a) netstat 8080
b) lsof -i :8080
c) ss -tulpn | grep :8080 (Correcto ✓)
d) top | grep 8080
Explicación: ss -tulpn muestra puertos y procesos. grep :8080 filtra por puerto.
👨💻 Práctica: Crear Dashboard Personalizado
Ejercicio: Script que muestra salud en 1 página
BASH
#!/bin/bash
# dashboard.sh - Monitoreo de servidor
clear
printf "╔════════════════════════════════════════════════════╗\n"
printf "║ DASHBOARD DE SERVIDOR ABACOM ║\n"
printf "║ Generado: $(date '+%Y-%m-%d %H:%M:%S') ║\n"
printf "╚════════════════════════════════════════════════════╝\n\n"
# CPU
printf "CPU (Load Average):\n"
uptime | awk -F'load average:' '{print " "$2}'
printf "\n"
# RAM
printf "Memoria RAM:\n"
free -h | awk 'NR==2 {printf " Total: %s | Usado: %s | Disponible: %s\n", $2, $3, $7}'
printf "\n"
# Disco
printf "Disco (Top 3):\n"
df -h | grep "^/dev" | sort -k5 -rn | head -3 | awk '{printf " %s: %3s / %s\n", $6, $5, $2}'
printf "\n"
# Procesos
printf "Procesos (Top CPU):\n"
top -b -n 1 | tail -5 | awk '{printf " %s: %s%%\n", $12, $9}' | head -3
printf "\n"
printf "✓ Fin de monitoreo\n"Ejecutar:
BASH
chmod +x dashboard.sh
./dashboard.sh📚 Recursos Adicionales
- Man Pages: man top, man htop, man free, man df, man iostat, man ss
- Linux Performance Tools: https://www.brendangregg.com/linuxperf.html
- htop Documentation: https://htop.dev/
- Sysstat Manual: https://github.com/sysstat/sysstat
Conclusión
Ahora sabes: ✓ Ver procesos con top y htop ✓ Monitorear CPU, RAM, disco ✓ Encontrar qué consume recursos ✓ Ver conexiones de red ✓ Crear alertas y dashboards
Para Abacom: Crea un script de monitoreo y úsalo diariamente para mantener servidores saludables.
Próximo paso: Integra estas herramientas en scripts de mantenimiento automático.