ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Servidores Linux

Cómo monitorear un servidor Linux: CPU, RAM, disco y ancho de banda

7 pasos 17 min de lectura 6 vistas 0
Contenido

Cuando un sitio se vuelve lento, SSH va con retraso o el tráfico se dispara de repente, lo primero es encontrar el cuello de botella. Esta guía le ofrece un kit práctico de monitoreo de servidores Linux: top/htop para la CPU y los procesos, free para la memoria, iostat e iotop para la E/S de disco, iftop, nload y vnstat para el consumo de ancho de banda, ss para saber quién mantiene las conexiones y un pequeño script de cron para recibir alertas. Se aplica a VPS y servidores dedicados con Debian/Ubuntu o Rocky Linux/AlmaLinux.

Paso 1: Instale las herramientas de monitoreo

top, free y ss vienen incluidos; el resto hay que instalarlos y, en Rocky/AlmaLinux, primero debe habilitar EPEL. Los ejemplos usan eth0 como nombre de interfaz, así que compruebe el nombre real con ip -br addr.

# Debian / Ubuntu
apt install -y htop sysstat iotop iftop nload vnstat nethogs
# Rocky Linux / AlmaLinux (la mayoría de las herramientas están en EPEL)
dnf install -y epel-release
dnf install -y htop sysstat iotop iftop nload vnstat nethogs

ip -br addr          # find your network interface name (eth0, ens3, ...)

Paso 2: Revise el uso de CPU y la carga con top y htop

Los tres valores de load average son las medias de 1, 5 y 15 minutos; si se mantienen por encima del número de núcleos, el servidor no da abasto. En top, fíjese en tres campos: un us alto significa que sus aplicaciones consumen CPU; un wa alto significa que la CPU está esperando al disco, así que revise después la E/S; en un VPS, un st (steal) alto de forma persistente indica contención en el host, y puede abrir un ticket para que nuestro equipo lo revise.

nproc                # number of CPU cores
uptime               # load average for 1, 5 and 15 minutes
top                  # 1 = per-core view, P = sort by CPU, M = sort by memory, q = quit
htop                 # F6 to choose the sort column, F9 to send a signal
ps aux --sort=-%cpu | head -n 10

Paso 3: Revise el uso de memoria y los procesos eliminados por OOM

Evalúe la presión de memoria por la columna available de free -h, no por la columna free, porque Linux usa la memoria libre como caché. Si si/so en vmstat se mantienen por encima de cero, el sistema está usando swap intensivamente. Cuando los procesos desaparecen sin dejar rastro, busque el OOM killer en dmesg. Si falta memoria, añada swap (consulte nuestro tutorial de swap) o amplíe su plan.

free -h
vmstat 1 5                                   # si/so > 0 continuously = swapping
ps aux --sort=-%mem | head -n 10
dmesg -T | grep -iE "out of memory|killed process"
journalctl -k --since "1 day ago" | grep -i oom

Paso 4: Localice problemas de E/S de disco y de espacio

En iostat, un %util cercano al 100 % junto con un await creciente significa que el disco está saturado. Después, iotop muestra qué proceso lee o escribe más, normalmente una base de datos, un proceso que escribe logs o una tarea de backup. Una vez habilitado, sysstat registra datos cada 10 minutos, así que sar le permite ver lo que ocurrió antes. Para problemas de espacio, consulte nuestro tutorial sobre disco lleno.

iostat -xz 1 5        # watch %util, r_await / w_await, rkB/s and wkB/s
iotop -oPa            # only processes doing I/O, accumulated totals
df -h                 # space usage
df -i                 # inode usage

# Guardar historial con sysstat y consultarlo después con sar
systemctl enable --now sysstat
sar -u                # CPU today
sar -d -p             # disks today

Paso 5: Vea el ancho de banda en tiempo real y el tráfico total

nload muestra las tasas de entrada y salida en tiempo real de una interfaz; iftop lista el tráfico por IP remota para que vea quién descarga mucho; nethogs lo desglosa por proceso. vnstat guarda en segundo plano los totales diarios y mensuales, lo que resulta útil para comprobar el consumo de ancho de banda o de tráfico. Un tráfico saliente inexplicable puede indicar que el servidor ha sido comprometido y está atacando a otros.

ip -s link show eth0          # total RX/TX bytes since boot
nload eth0                    # live in/out graph
iftop -i eth0 -nNP            # live traffic per remote host and port
nethogs eth0                  # live traffic per process

systemctl enable --now vnstat
vnstat -i eth0 -l             # live rate
vnstat -d                     # daily totals
vnstat -m                     # monthly totals

Paso 6: Encuentre el origen de las conexiones y del ancho de banda con ss

ss es el sustituto más rápido de netstat. El siguiente comando cuenta las conexiones establecidas por IP remota, lo que revela rápidamente crawlers agresivos u orígenes de HTTP flood que después puede bloquear con el firewall o con Fail2ban.

ss -s                                              # connection summary
ss -tunp | head -n 30                              # connections with process names
ss -lntup                                          # listening ports

# Las 10 IP remotas con más conexiones TCP establecidas
ss -Htn state established | awk '{sub(/:[0-9]+$/,"",$4); print $4}' \
  | sort | uniq -c | sort -rn | head -n 10

# Solo las conexiones a su servidor web
ss -Htn state established '( sport = :443 )' | wc -l

Paso 7: Alertas sencillas con un script de cron

Si todavía no usa Zabbix ni Prometheus, un script corto puede comprobar la carga, la memoria disponible y el uso de disco cada cinco minutos, registrar cualquier umbral superado y enviarlo a un webhook, como un bot de Telegram, Slack o Discord (adapte el cuerpo JSON a la plataforma).

cat > /usr/local/bin/check-health.sh <<'EOF'
#!/bin/bash
LOAD_MAX=$(nproc)          # alert when 1-min load > number of cores
MEM_MIN_MB=200             # alert when available memory < 200 MB
DISK_MAX=90                # alert when a filesystem is >= 90 % full
WEBHOOK="https://hooks.example.com/your-webhook"
HOST=$(hostname)
MSG=""

LOAD=$(cut -d' ' -f1 /proc/loadavg)
if awk -v l="$LOAD" -v m="$LOAD_MAX" 'BEGIN{exit !(l>m)}'; then
  MSG+="load $LOAD > $LOAD_MAX; "
fi

AVAIL=$(free -m | awk '/^Mem:/{print $7}')
if [ "$AVAIL" -lt "$MEM_MIN_MB" ]; then MSG+="available memory ${AVAIL}MB; "; fi

while read -r USE MNT; do
  if [ "${USE%\%}" -ge "$DISK_MAX" ]; then MSG+="disk $MNT at $USE; "; fi
done < <(df -P -x tmpfs -x devtmpfs | awk 'NR>1{print $5, $6}')

if [ -n "$MSG" ]; then
  echo "$(date '+%F %T') $HOST $MSG" >> /var/log/health-alert.log
  curl -s -m 10 -H 'Content-Type: application/json' \
    -d "{\"text\":\"[$HOST] $MSG\"}" "$WEBHOOK" > /dev/null
fi
EOF
chmod +x /usr/local/bin/check-health.sh
/usr/local/bin/check-health.sh; tail /var/log/health-alert.log

# Ejecutar cada 5 minutos: crontab -e
*/5 * * * * /usr/local/bin/check-health.sh
Un script es solo una red de seguridad. En servidores con mucha actividad, despliegue Netdata, Zabbix o Prometheus con Grafana, y añada una comprobación externa de disponibilidad desde otro servidor para recibir alertas incluso cuando toda la máquina esté caída.

Preguntas frecuentes

¿El uso de CPU es bajo en top pero la carga es alta?

La carga también cuenta los procesos que esperan E/S de disco (estado D). Revise el valor wa e iostat; la causa habitual es un disco ocupado o un almacenamiento de red lento.

¿vnstat dice «no data available»?

Un vnstat recién instalado aún no ha registrado nada; espere unos minutos con el servicio en ejecución. Confirme también que su interfaz aparece en vnstat --iflist.

¿Cómo encuentro el proceso que más ancho de banda consume?

Ejecute nethogs eth0 para ver el tráfico en tiempo real por proceso, y luego ss -tunp para ver a dónde se conecta ese proceso, y decida si es legítimo.

¿Sigue con problemas después de seguir estos pasos? Abra un ticket de soporte y el equipo técnico de IMIDC, disponible 24/7, le ayudará. Incluya la IP del servidor, la versión del sistema operativo, los comandos que ejecutó y la salida completa del error para que podamos localizar el problema más rápido.

¿Fue útil la respuesta?

Tutoriales relacionados