Ghost AcademySecLearn// Seguridad Informática
📊 Monitorización Básica · Linux · top · htop · iotop · ss · Netdata · Glances
Monitorización Básica Linux
// CPU · RAM · I/O · Disco · Red · Procesos · Netdata · Glances · stress

Guía completa de monitorización de sistemas Linux: conceptos clave de load average, herramientas del sistema (top, htop, iotop, df/du, netstat/ss), instalación de monitores web en tiempo real (Netdata y Glances), simulación de carga con stress, y cheatsheet de comandos esenciales.

top · htop · iotop · ps aux ss · netstat · lsof · LISTEN vs ESTABLISHED load average · CPU cores · saturación df · du · ncdu · inodos Netdata :19999 · Glances :61208 · stress
🧭
Conceptos Rápidos — Qué Mirar y Por Qué
Seis áreas clave para diagnosticar el estado de un sistema Linux.
🔥
CPU
% por proceso + load average. Indica si un proceso acapara un núcleo o si hay cola de espera global.
🧠
Memoria
RAM usada, buffers, caché y swap. Linux usa RAM libre como caché — el swap elevado es la señal de alerta real.
💽
I/O Disco
Procesos con alta lectura/escritura → impacto directo en latencia. iowait alto = cuello de botella en disco.
📦
Disco / Espacio
Tamaño usado, inodos disponibles. Un disco lleno puede colapsar servicios silenciosamente.
🌐
Red
Conexiones abiertas, puertos en escucha, tráfico entrante/saliente. Detecta servicios expuestos o conexiones anómalas.
⚙️
Procesos
Procesos "pesados" y usuarios consumidores. ps aux revela scripts automatizados, usuarios root y tiempos de CPU.
📈
Load Average — Cómo Interpretar
Los tres números representan la carga media de procesos en cola en los últimos 1, 5 y 15 minutos. Siempre se comparan con el número de núcleos de CPU.
Ejemplo: sistema de 4 cores
1 min
8.28
5 min
5.36
15 min
2.83

Carga 8.28 en 4 cores = 207% de saturación — el doble de procesos esperando CPU de los que pueden ejecutarse simultáneamente.

load < cores → relajado load ≈ cores → 100% saturado load > cores → cuello de botella
top mostrando load average 0.36 0.44 0.25 — sistema tranquilo
top — load average 0.36, 0.44, 0.25 en sistema de 2 cores: muy desahogado

Para confirmar qué proceso causa la carga, usa ps aux | grep <proceso> para ver PID, usuario, %CPU y tiempo acumulado. Si el proceso padre ya terminó, usa ps -fp <PID> para ver el PPID y rastrear el origen (cron, script de init, logrotate…).

📦
Instalación Rápida de Herramientas
Un solo comando instala el kit completo de monitorización en Debian/Ubuntu o RHEL/CentOS.
bash — Debian / Ubuntu
sudo apt update
sudo apt install -y htop iotop net-tools procps sysstat ncdu
bash — RHEL / CentOS
sudo dnf install -y htop iotop net-tools procps-ng sysstat
# o con yum:
sudo yum install -y htop iotop net-tools procps-ng sysstat
ℹ️ netstat vs ss: netstat viene en net-tools. En sistemas modernos se recomienda ss (parte de iproute2, instalado por defecto) como alternativa más rápida y completa.
🖥️
top — Monitorización Básica
Instalado por defecto en todas las distros. Vista en tiempo real de CPU, memoria y procesos.
bash
top                        # modo interactivo
top -b -n1 | head -n 20   # snapshot no interactivo
Tecla Acción en modo interactivo
POrdenar por uso de CPU
MOrdenar por uso de memoria — observa %MEM, RES, VIRT, COMMAND
1Mostrar cada núcleo de CPU por separado
uFiltrar procesos por usuario
kMatar proceso por PID
📊
htop — Vista Mejorada e Interactiva
Versión visual de top con barras de CPU por núcleo, colores por tipo de carga y atajos de teclado avanzados.
bash
htop             # arrancar
htop -u root     # ver solo procesos de root
htop mostrando barras de CPU con 2 cores activos
htop — barras de CPU por núcleo, uso de Mem, Swap y load average

Colores de las barras de CPU

Verde — procesos de usuario (aplicaciones normales)
Rojo — procesos del kernel (drivers, interrupciones). Mucho rojo = kernel trabajando duro.
Azul — procesos con baja prioridad (nice)
Naranja/Amarillo — I/O wait (CPU esperando disco). Valor alto = cuello de botella en disco.
htop cabecera mostrando Tasks, Load Average y Uptime
Cabecera de htop — Tasks, hilos, load average 0.15/0.55/1.57 en sistema de 2 cores (excelente estado)

Atajos de teclado útiles

TeclaAcción
F6Ordenar lista por CPU, mem, time…
F3Buscar proceso por nombre
F5Mostrar árbol de procesos (herencia de recursos)
F9Matar proceso — seleccionar señal
F2Configurar columnas visibles
📌 Regla de memoria: Linux usa la RAM libre como caché. No te alarmes si la barra de Mem parece "llena" — lo importante es que el swap esté cerca de 0K.
💽
iotop — Quién Hace I/O a Disco
Identifica qué proceso lee o escribe en disco y a qué velocidad. Requiere privilegios de root para acceder a las métricas del kernel.
bash
sudo iotop              # modo interactivo
sudo iotop -o -P        # -o solo procesos con I/O activo, -P muestra PIDs
sudo iotop -b -n5       # batch: 5 muestras no interactivas (ideal para scripts)
iotop encabezado con Total DISK READ y DISK WRITE
iotop — cabecera con totales de lectura/escritura en disco
iotop mostrando proceso dd con 209 MB/s de escritura
iotop identifica el proceso dd (TID 8121) escribiendo a 209 MB/s — único responsable de toda la actividad de disco

Demostración práctica — generar I/O de prueba

bash — terminal 1: generar I/O
# Escribe 5 GB directamente al disco (sin caché)
dd if=/dev/zero of=/tmp/testfile_grande bs=1M count=5000 oflag=direct
bash — terminal 2: observar
# Ver qué PID genera la escritura
sudo iotop -o
# El PID del proceso dd aparecerá con alto DISK WRITE
⚠️ Nota: iotop necesita contabilidad I/O activada en el kernel. Si no funciona, usa pidstat -d (paquete sysstat) como alternativa.
📦
df · du · ncdu — Uso de Disco
Tres herramientas complementarias para conocer el espacio disponible, localizar los directorios más pesados y navegar visualmente el uso del disco.
df — sistemas de ficheros
du — directorios
ncdu — navegación interactiva
bash — df
df -hT          # human readable + tipo de FS
df -h /var       # espacio en /var
df -i            # uso de inodos (importante en /var/log)
bash — du
sudo du -sh /var/log                      # tamaño total de /var/log
sudo du -ah /var | sort -rh | head -n 20  # 20 más grandes
sudo du --max-depth=1 -h /home            # resumen por subdirectorios
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null  # archivos >100MB
bash — ncdu (interactivo)
sudo apt install ncdu
sudo ncdu /       # escanea todo el sistema (tarda unos segundos)

Navegación: ↑↓ para moverse · Enter para entrar en un directorio · ← para retroceder · d para borrar (con confirmación) · ? para ayuda. Los directorios se ordenan automáticamente por tamaño — los más grandes arriba.

ncdu mostrando árbol de directorios ordenados por tamaño con barras de porcentaje
ncdu / — navegación visual del disco con barras de porcentaje por directorio
🌐
netstat · ss — Conexiones y Puertos
ss es el reemplazo moderno de netstat. Ambos muestran conexiones activas, puertos en escucha y el proceso responsable.
LISTEN
Un proceso está esperando conexiones entrantes en un puerto. Es como un teléfono sonando esperando que alguien descuelgue.
sshd en puerto 22 → LISTEN
ESTABLISHED
Existe una conexión activa entre cliente y servidor. Es como cuando ya contestaste la llamada y estás hablando.
cliente conectado por SSH → ESTABLISHED
bash — ss (recomendado)
sudo ss -tulpen         # TCP+UDP en escucha con PID y usuario
sudo ss -ltnp           # -l LISTEN · -t TCP · -n números · -p PID
ss -s                   # resumen de estadísticas
ss -tn state established  # conexiones TCP activas
ss -tulpen mostrando puertos en escucha con proceso y usuario
sudo ss -tulpen — puertos en escucha con proceso, PID y UID del usuario propietario
bash — netstat (legado) y lsof
sudo netstat -antp       # conexiones TCP activas
sudo netstat -tulnp      # puertos en escucha con proceso
sudo lsof -i -P -n | grep LISTEN  # alternativa con lsof
netstat -antp mostrando conexiones TCP activas
netstat -antp — conexiones TCP con estado y proceso
netstat -tulnp mostrando puertos escuchando con nombre de proceso
netstat -tulnp — puertos en escucha: puerto 80 → nginx, puerto 22 → sshd
ss -tn state established mostrando conexiones SSH activas
ss -tn state established — conexiones TCP activas (estado ESTABLISHED)
Puertos identificados en el ejercicio: 8125/19999 → netdata · 53 → systemd-resolve (DNS local) · 5353/41136 → avahi-daemon (mDNS) · 631 → cupsd (impresión)
📡
Netdata — Monitor Web en Tiempo Real
Gráficas por segundo accesibles desde el navegador en http://localhost:19999. Ligero, sin configuración, con datos históricos y alertas.
bash — instalación (script oficial)
# Descarga el script y ejecútalo (dos pasos — evita problemas de shell)
curl -sSL https://get.netdata.cloud/kickstart.sh -o kickstart.sh
sudo bash kickstart.sh

# Iniciar y habilitar al arranque
sudo systemctl enable --now netdata

# Verificar estado
sudo systemctl status netdata

# Abrir en navegador
# → http://localhost:19999
Netdata dashboard mostrando CPU, memoria y procesos en tiempo real
Netdata — dashboard de visión general con CPU, memoria, load average y procesos
Netdata gráfica de CPU detallada con user vs system vs iowait
Netdata — detalle de CPU: user, system e iowait. Un iowait alto indica cuello de botella en disco.

Qué mirar en el dashboard

🔥 CPU — System Overview
›

iowait alto = CPU esperando disco → problema de I/O, no de CPU. Distingue entre user (aplicaciones), system (kernel) e iowait.

🧠 Memoria + Swap
›

Si el swap crece constantemente → el sistema se está quedando sin RAM física. La latencia se degrada severamente al paginar en disco.

💽 Disk I/O — Latencia y Utilización
›

Latencia > 50ms o utilización al 100% = disco saturado. Observa lecturas/escrituras por segundo (r/s, w/s).

🌐 Red — Bandwidth y Errores
›

Picos inesperados de tráfico pueden indicar actividad maliciosa. Drops/Errors crecientes = problema en tarjeta de red o configuración.

⚙️ Aplicaciones — Apache / MySQL / Nginx
›

Códigos 5xx en aumento = error grave en servidor. Revisa conexiones activas vs máximas en MySQL, y workers activos en Apache/Nginx. Consultas lentas en DB = cuello de botella de aplicación.

bash — acceso seguro por SSH tunnel (entorno de producción)
# Tunnel SSH: Netdata no queda expuesto a la red pública
ssh -L 19999:localhost:19999 usuario@servidor
# → Abre http://localhost:19999 en tu navegador local
👁️
Glances — Monitor Compacto CLI + Web
Panel único que resume CPU, RAM, swap, red, disco y procesos. Modo terminal y modo web en http://<ip>:61208.
bash — instalación con pipx (recomendado)
sudo apt install python3-pip pipx -y
pipx install glances
pipx inject glances fastapi    # dependencia web
pipx inject glances jinja2     # renderizado de página
pipx ensurepath
source ~/.bashrc
bash — ejecutar Glances
glances                  # modo terminal (h=ayuda, q=salir)
glances -w -B 0.0.0.0   # modo web accesible desde red local → :61208
# desde la misma VM: http://127.0.0.1:61208
# desde el host:     http://<IP_VM>:61208

# Abrir puerto en UFW si es necesario
sudo ufw allow 61208/tcp
Glances ejecutándose en terminal con solución de dependencias faltantes
Glances modo terminal — instalación con pipx y resolución de dependencias (fastapi + jinja2)
Interfaz web de Glances en http://192.168.1.44:61208 con dashboard completo
Glances web — dashboard completo en http://192.168.1.44:61208
Glances modo terminal mostrando CPU, memoria, red, disco y procesos
Glances modo terminal — vista compacta de todas las métricas del sistema en una pantalla
🔌 VirtualBox y NAT: Con adaptador NAT el puerto 61208 no se expone al host. Usa modo Bridge, Adaptador solo-anfitrión o configura port forwarding en los ajustes de red de VirtualBox.
🎨 Código de colores de Glances: ■ Verde = OK · ■ Azul = Cuidado · ■ Magenta = Alerta · ■ Rojo = Crítico. Busca primero cualquier métrica en magenta o rojo.
⚡
stress / stress-ng — Generador de Carga
Lanza procesos artificiales para estresar CPU, memoria, disco o I/O. Ideal para ver cómo reacciona el sistema bajo carga y para verificar las herramientas de monitorización.
bash — instalación
sudo apt install stress stress-ng -y
--cpu N
N procesos saturando CPU. Usa $(nproc) para todos los núcleos.
stress --cpu $(nproc) --timeout 300s
--io N
N procesos de I/O (operaciones entrada/salida).
stress --io 4 --timeout 20s
--vm N --vm-bytes B
N procesos reservando memoria (malloc/free).
stress --vm 2 --vm-bytes 512M --timeout 15s
--hdd N --hdd-bytes B
N procesos escribiendo/borrando archivos.
stress --hdd 1 --hdd-bytes 2G --timeout 10s
bash — carga mixta en dos terminales
# Terminal 1: genera carga mixta (CPU + I/O + RAM) durante 30s
stress --cpu 4 --io 2 --vm 2 --vm-bytes 256M --timeout 30s

# Terminal 2: observa en htop
htop
bash — sin instalar nada (bash puro, 5 minutos)
timeout 5m bash -c 'for i in $(seq $(nproc)); do yes > /dev/null & done; wait'
# Lanza un proceso yes por cada núcleo → los mata automáticamente a los 5 min
⚠️ stress no es un benchmark — solo genera carga artificial. Puede ralentizar o colgar una VM si pides más recursos de los disponibles. Úsalo solo en entornos de prueba, nunca en producción.
🔍
Diagnóstico Integrado — El Servicio Va Lento
Flujo de trabajo paso a paso para identificar el cuello de botella cuando un servicio responde lento o el sistema está saturado.
1
top
¿CPU alta? Identifica el proceso culpable (P para ordenar por CPU). Anota el PID.
2
iotop
¿I/O alto? Si la CPU está baja pero el sistema va lento, el problema es el disco. sudo iotop -o
3
df / du
¿Disco lleno? df -h para ver % usado. du -ah /var | sort -rh | head -n 20 para localizar archivos grandes.
4
ss
¿Demasiadas conexiones? ss -tn state established | wc -l — un número muy alto puede saturar el servidor.
5
htop
Identifica el proceso culpable con detalle. Si se necesita más, usa strace -p <PID> (avanzado).
📋
Cheatsheet — Comandos Rápidos
Referencia de los comandos más usados agrupados por categoría.
🔥 CPU / Procesos
top
htop
ps aux | sort -nrk 3,3 | head -n 10 # top 10 CPU
ps aux | sort -nrk 4,4 | head -n 10 # top 10 MEM
ps aux | grep <proceso>
ps -fp <PID> # ver proceso padre
💽 Disco / I/O
df -hT
du -sh /path/*
du -ah /path | sort -rh | head -n 20
ncdu /path
sudo iotop -o -P
iostat -xz 1 # requiere sysstat
🌐 Red / Sockets
sudo ss -tulpen
sudo ss -ltnp
ss -tn state established
sudo netstat -tulnp
sudo lsof -i -P -n | grep LISTEN
📡 Netdata / Glances
sudo systemctl enable --now netdata
# → http://localhost:19999
glances -w -B 0.0.0.0
# → http://<ip>:61208
stress --cpu $(nproc) --timeout 60s
stress-ng --cpu 0 --timeout 5m