Servidor que no responde: Diagnósticos basados en comandos
Introducción
Un servidor que deja de responder es uno de los problemas más críticos que enfrentan los administradores de sistemas. Ya sea que estés administrando servidores web, servidores de bases de datos o servidores de aplicaciones, los sistemas que no responden pueden llevar a un tiempo de inactividad significativo, pérdida de ingresos y usuarios frustrados. Esta guía completa proporciona un enfoque sistemático de línea de comandos para diagnosticar y resolver problemas de falta de respuesta del servidor.
Comprender cómo diagnosticar adecuadamente un servidor que no responde es esencial para cualquier ingeniero DevOps, administrador de sistemas o profesional de TI. Esta guía te guiará a través de un proceso de solución de problemas metódico utilizando comandos de diagnóstico y técnicas probadas para identificar las causas raíz e implementar soluciones efectivas.
Comprender la falta de respuesta del servidor
¿Qué significa "No responde"?
La falta de respuesta del servidor puede manifestarse de varias maneras:
- Tiempo de espera de red completo: No se puede hacer ping o conectar al servidor
- Respuesta parcial: El servidor responde al ping pero los servicios no están disponibles
- Respuesta lenta: El servidor responde pero con retrasos significativos
- Problemas específicos del servicio: Aplicaciones o servicios específicos fallan mientras otros funcionan
- Fallos intermitentes: El servidor responde de manera inconsistente
Síntomas comunes
Antes de profundizar en el diagnóstico, reconoce estos síntomas comunes:
- Las conexiones SSH se agotan o se niegan a establecerse
- Los servicios web devuelven errores HTTP 502/503/504
- Las conexiones de base de datos fallan o se quedan colgadas
- Las solicitudes de ping se agotan por completo
- Los servicios parecen estar ejecutándose pero no responden a las solicitudes
- Alta latencia en todas las comunicaciones de red
- La consola del sistema muestra salida congelada
Evaluación inicial y estrategia de diagnóstico
El enfoque sistemático
Cuando te enfrentes a un servidor que no responde, sigue esta metodología de diagnóstico estructurada:
- Verificar el problema: Confirmar el problema desde múltiples ubicaciones
- Verificar factores externos: Conectividad de red, resolución DNS
- Evaluar recursos del sistema: CPU, memoria, E/S de disco
- Revisar cambios recientes: Actualizaciones, implementaciones, cambios de configuración
- Analizar registros: Registros del sistema y de aplicaciones en busca de errores
- Probar servicios individualmente: Aislar el componente problemático
Acceso remoto vs acceso por consola
Tu enfoque de diagnóstico difiere según el método de acceso:
- Acceso remoto (SSH): Si SSH está disponible, tienes capacidades de diagnóstico completas
- Acceso por consola: Si SSH falla, usa acceso a consola KVM/IPMI/física
- Sin acceso: Contacta al proveedor de hosting o usa herramientas de administración fuera de banda
Paso 1: Pruebas iniciales de conectividad
Probar la conectividad de red básica
Comienza con pruebas básicas de alcanzabilidad de red desde tu máquina local:
# Prueba básica de ping
ping -c 4 your-server-ip
# Traceroute para identificar problemas de ruta de red
traceroute your-server-ip
# MTR para monitoreo continuo de red
mtr -c 100 your-server-ip
# Verificar puertos específicos
telnet your-server-ip 22
nc -zv your-server-ip 22 80 443
Interpretación:
- Sin respuesta de ping: Problema de red o firewall bloqueando ICMP
- Ping funciona pero puertos cerrados: Servicios caídos o reglas de firewall cambiadas
- Pérdida de paquetes: Congestión de red o problemas de hardware
- Alta latencia: Problemas de ruta de red o agotamiento de recursos del servidor
Pruebas de resolución DNS
Verifica que DNS no esté causando problemas de conectividad:
# Probar resolución DNS
nslookup your-domain.com
dig your-domain.com +short
# Verificar DNS inverso
dig -x your-server-ip
# Probar con servidores DNS alternativos
nslookup your-domain.com 8.8.8.8
Si DNS falla pero la dirección IP funciona, el problema está relacionado con DNS, no con la falta de respuesta del servidor.
Paso 2: Establecer acceso al servidor
Usar métodos de acceso alternativos
Si SSH estándar falla, intenta estas alternativas:
# SSH con salida detallada
ssh -vvv user@server-ip
# SSH en puerto alternativo
ssh -p 2222 user@server-ip
# SSH con archivo de identidad específico
ssh -i /path/to/key user@server-ip
# SSH a través de host de salto
ssh -J jumphost user@server-ip
Opciones de acceso por consola
Cuando SSH no está disponible por completo:
- Consola del proveedor de nube: AWS EC2 Serial Console, DigitalOcean Droplet Console
- IPMI/iLO/iDRAC: Administración fuera de banda para servidores bare metal
- KVM sobre IP: Acceso a consola remota
- Acceso físico: Conexión directa de teclado/monitor
Paso 3: Diagnósticos de recursos del sistema
Análisis de uso de CPU
Una vez que tengas acceso, verifica inmediatamente la utilización de CPU:
# Resumen rápido de CPU
top -bn1 | head -20
# Estadísticas detalladas de CPU
mpstat 1 5
# Uso de CPU por proceso
ps aux --sort=-%cpu | head -15
# Monitoreo de CPU en tiempo real
htop
# Información y utilización de CPU
lscpu
uptime
Indicadores de CPU alta:
- Promedio de carga significativamente mayor que el recuento de CPU
- Uno o más procesos consumiendo >90% de CPU
- CPU del sistema (sy) más alta que CPU del usuario (us)
- Porcentaje de iowait (wa) consistentemente alto
Análisis de uso de memoria
El agotamiento de memoria es una causa común de falta de respuesta:
# Resumen de uso de memoria
free -h
# Estadísticas detalladas de memoria
vmstat 1 5
# Uso de memoria por proceso
ps aux --sort=-%mem | head -15
# Verificar actividad del OOM killer
dmesg | grep -i "out of memory"
grep -i "killed process" /var/log/kern.log
# Uso de memoria slab
slabtop -o
Indicadores de problemas de memoria:
- Memoria disponible cerca de cero
- Alto uso de swap (Swap usado > 50%)
- Mensajes del OOM killer en registros
- Procesos terminados inesperadamente
Análisis de E/S de disco
Los cuellos de botella de disco pueden hacer que los sistemas parezcan no responder:
# Estadísticas de E/S de disco
iostat -x 1 5
# Uso de E/S por proceso
iotop -o
# Uso de disco por sistema de archivos
df -h
# Uso de inodos
df -i
# Encontrar archivos grandes
du -sh /* | sort -rh | head -10
# Verificar errores de disco
dmesg | grep -i "I/O error"
smartctl -a /dev/sda
Indicadores de problemas de disco:
- %util acercándose al 100%
- Tiempos de await altos (>50ms)
- Espacio en disco al 100%
- Uso de inodos al 100%
- Errores de E/S en dmesg
Paso 4: Diagnósticos de red y servicios
Análisis de conexión de red
Verifica las conexiones activas y las estadísticas de red:
# Conexiones de red activas
netstat -tunapl
ss -tunapl
# Recuentos de conexiones por estado
ss -s
# Conexiones por dirección IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
# Estadísticas de interfaz de red
ip -s link
ifconfig
# Verificar errores de red
netstat -i
Indicadores de problemas de red:
- Conexiones excesivas en estados TIME_WAIT o CLOSE_WAIT
- IP única con cientos de conexiones (ataque potencial)
- Errores o caídas de interfaz de red
- Firewall descartando paquetes
Verificación de estado del servicio
Verifica el estado de servicios críticos:
# Listar todos los servicios en ejecución
systemctl list-units --type=service --state=running
# Verificar estado de servicio específico
systemctl status nginx
systemctl status mysql
systemctl status apache2
# Verificar tiempos de inicio del servicio
systemd-analyze blame
# Verificar servicios fallidos
systemctl --failed
Asociación de puerto y proceso
Identifica qué está escuchando en los puertos esperados:
# Listar puertos de escucha con procesos
ss -tulpn
netstat -tulpn
# Verificar puerto específico
lsof -i :80
fuser -v 80/tcp
# Listar todos los archivos abiertos por proceso
lsof -p <PID>
Paso 5: Análisis de registros
Examen de registros del sistema
Los registros del sistema a menudo contienen información de diagnóstico crítica:
# Mensajes recientes del sistema
journalctl -xe
# Últimos 100 mensajes del kernel
dmesg | tail -100
# Registros de autenticación
tail -100 /var/log/auth.log
grep "Failed password" /var/log/auth.log | tail -20
# Registro del sistema
tail -100 /var/log/syslog
tail -100 /var/log/messages
# Verificar segfaults
journalctl -b | grep -i segfault
# Buffer de anillo del kernel
dmesg -T | grep -i "error\|fail\|warning"
Registros específicos de aplicaciones
Revisa los registros para servicios específicos:
# Registros del servidor web
tail -f /var/log/nginx/error.log
tail -f /var/log/apache2/error.log
# Registros de base de datos
tail -f /var/log/mysql/error.log
tail -f /var/log/postgresql/postgresql-*.log
# Registros de aplicación
journalctl -u your-service -f
# Buscar errores en la última hora
journalctl --since "1 hour ago" | grep -i error
Paso 6: Análisis de procesos y servicios
Identificar procesos problemáticos
Encuentra procesos que causan problemas:
# Principales consumidores de CPU
ps aux --sort=-%cpu | head -10
# Principales consumidores de memoria
ps aux --sort=-%mem | head -10
# Procesos con mayor recuento de archivos abiertos
lsof | awk '{print $2}' | sort | uniq -c | sort -rn | head
# Procesos de larga ejecución
ps -eo pid,user,comm,start,time | sort -k4
# Procesos zombie
ps aux | grep -w Z
# Árbol de procesos
pstree -p
Analizar el comportamiento del proceso
Obtén información detallada sobre procesos problemáticos:
# Detalles del proceso
ps -fp <PID>
# Límites del proceso
cat /proc/<PID>/limits
# Descriptores de archivo del proceso
ls -l /proc/<PID>/fd | wc -l
# Conexiones de red del proceso
lsof -p <PID> -i
# Rastrear llamadas al sistema
strace -p <PID>
# Traza de pila del proceso
pstack <PID>
gdb -p <PID> -batch -ex "thread apply all bt"
Paso 7: Verificar problemas de seguridad
Detectar intrusiones o ataques
Busca signos de compromiso de seguridad:
# Verificar procesos inusuales
ps aux | grep -v "^root\|^www-data\|^mysql" | less
# Actividad de inicio de sesión reciente
last -a | head -20
lastb | head -20 # Intentos de inicio de sesión fallidos
# Usuarios conectados actualmente
w
who
# Conexiones de red inusuales
ss -tunapl | grep ESTABLISHED | grep -v ":80\|:443\|:22"
# Verificar rootkits
rkhunter --check
chkrootkit
# Verificar procesos de escucha
ss -tulpn | grep LISTEN
Revisión de firewall y registros de seguridad
# Verificar reglas de firewall
iptables -L -n -v
ufw status verbose
# Revisión de registros de seguridad
grep -i "refused\|denied\|error" /var/log/auth.log | tail -50
# Estado de Fail2ban (si está instalado)
fail2ban-client status
fail2ban-client status sshd
Análisis de causa raíz
Causas comunes de falta de respuesta del servidor
1. Agotamiento de recursos
Agotamiento de CPU:
- Procesos desbocados consumiendo todos los ciclos de CPU
- Bucles infinitos en aplicaciones
- Mineros de criptomonedas
- Ataques DDoS
Agotamiento de memoria:
- Fugas de memoria en aplicaciones
- Memoria insuficiente para la carga de trabajo
- Caché creciendo sin límites
- OOM killer terminando procesos críticos
Agotamiento de disco:
- Sistema de archivos lleno impidiendo escrituras
- Agotamiento de inodos
- Cuello de botella de E/S de disco
- Fallo de hardware
2. Problemas de red
- Cambios en reglas de firewall bloqueando acceso
- DDoS o ataques de fuerza bruta
- Errores de interfaz de red
- Problemas de enrutamiento
- Saturación de ancho de banda
3. Fallos de servicio
- Caídas de aplicaciones
- Agotamiento de conexiones de base de datos
- Errores de configuración
- Bloqueos en aplicaciones
- Dependencias de servicio fallando
4. Problemas del kernel
- Pánico del kernel
- Fallos de controladores
- Corrupción del sistema de archivos
- Condiciones de falta de memoria
Soluciones y remediación
Acciones de recuperación inmediata
Si está limitado por CPU:
# Matar proceso problemático
kill <PID>
kill -9 <PID> # Forzar muerte si es necesario
# Reducir prioridad del proceso
renice +10 <PID>
# Limitar uso de CPU con cpulimit
cpulimit -p <PID> -l 50
Si está limitado por memoria:
# Limpiar caché de página (operación segura)
sync && echo 1 > /proc/sys/vm/drop_caches
# Reiniciar servicio que consume mucha memoria
systemctl restart service-name
# Agregar espacio de swap temporalmente
dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
Si está limitado por disco:
# Encontrar y eliminar archivos grandes
find /var/log -type f -size +100M -exec rm -f {} \;
# Limpiar caché de paquetes
apt clean # Ubuntu/Debian
yum clean all # CentOS/RHEL
# Eliminar kernels antiguos
apt autoremove --purge # Ubuntu/Debian
# Comprimir registros antiguos
gzip /var/log/*.log.1
Si el servicio se bloqueó:
# Reiniciar servicio
systemctl restart service-name
# Habilitar reinicio automático del servicio
systemctl edit service-name
# Agregar:
# [Service]
# Restart=always
# RestartSec=10
# Iniciar servicio con depuración
service-name --verbose --debug
Correcciones relacionadas con la red
# Reiniciar redes
systemctl restart networking
systemctl restart NetworkManager
# Vaciar y recargar firewall
iptables -F
systemctl restart firewall
# Restablecer interfaz de red
ip link set eth0 down
ip link set eth0 up
# Limpiar caché ARP
ip neigh flush all
Recuperación de servicios
# Reinicio elegante de servicio
systemctl reload service-name
# Reinicio forzado con tiempo de espera
timeout 30 systemctl restart service-name || systemctl kill service-name
# Restablecer estado fallido
systemctl reset-failed service-name
Prevención y mejores prácticas
Monitoreo proactivo
Implementa monitoreo para detectar problemas antes de que causen falta de respuesta:
# Instalar herramientas de monitoreo
apt install sysstat monitoring-plugins nagios-plugins-basic
# Habilitar recopilación de estadísticas del sistema
systemctl enable sysstat
systemctl start sysstat
# Crear script de monitoreo
cat > /usr/local/bin/resource-monitor.sh << 'EOF'
#!/bin/bash
CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM=$(free | grep Mem | awk '{print ($3/$2) * 100}')
DISK=$(df / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
if (( $(echo "$CPU > 90" | bc -l) )); then
echo "High CPU: $CPU%" | mail -s "Alert: High CPU" [email protected]
fi
if (( $(echo "$MEM > 90" | bc -l) )); then
echo "High Memory: $MEM%" | mail -s "Alert: High Memory" [email protected]
fi
if [ $DISK -gt 90 ]; then
echo "High Disk: $DISK%" | mail -s "Alert: High Disk" [email protected]
fi
EOF
chmod +x /usr/local/bin/resource-monitor.sh
# Agregar a crontab
echo "*/5 * * * * /usr/local/bin/resource-monitor.sh" | crontab -
Endurecimiento del sistema
# Establecer límites de recursos
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
* soft nproc 32768
* hard nproc 32768
EOF
# Optimizar parámetros del kernel
cat >> /etc/sysctl.conf << EOF
# Aumentar máximo de conexiones
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8096
# Optimizar memoria
vm.swappiness = 10
vm.vfs_cache_pressure = 50
# Ajuste de red
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
EOF
sysctl -p
Recuperación automatizada
Crea scripts watchdog para servicios críticos:
cat > /usr/local/bin/service-watchdog.sh << 'EOF'
#!/bin/bash
SERVICES=("nginx" "mysql" "php-fpm")
for SERVICE in "${SERVICES[@]}"; do
if ! systemctl is-active --quiet "$SERVICE"; then
echo "$(date): $SERVICE is down, restarting..." >> /var/log/watchdog.log
systemctl restart "$SERVICE"
echo "$SERVICE restarted" | mail -s "Service Recovery: $SERVICE" [email protected]
fi
done
EOF
chmod +x /usr/local/bin/service-watchdog.sh
echo "*/5 * * * * /usr/local/bin/service-watchdog.sh" | crontab -
Mantenimiento regular
# Script de limpieza semanal
cat > /usr/local/bin/weekly-maintenance.sh << 'EOF'
#!/bin/bash
# Rotar registros
logrotate -f /etc/logrotate.conf
# Limpiar caché de paquetes
apt autoremove -y
apt autoclean
# Actualizar base de datos
updatedb
# Verificar salud del disco
smartctl -H /dev/sda
# Enviar informe
df -h > /tmp/disk-report.txt
free -h >> /tmp/disk-report.txt
mail -s "Weekly Maintenance Report" [email protected] < /tmp/disk-report.txt
EOF
chmod +x /usr/local/bin/weekly-maintenance.sh
Técnicas de diagnóstico avanzadas
Perfilado de rendimiento
# Perfil de rendimiento de todo el sistema
perf record -a -g sleep 30
perf report
# Gráficos de llama de CPU
git clone https://github.com/brendangregg/FlameGraph
perf record -F 99 -a -g -- sleep 60
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > cpu-flamegraph.svg
# Perfilado de memoria
valgrind --leak-check=full --show-leak-kinds=all command
# Seguimiento detallado de E/S
blktrace -d /dev/sda -o - | blkparse -i -
Depuración del kernel
# Habilitar depuración del kernel
echo 1 > /proc/sys/kernel/sysrq
# Volcar backtrace de todas las tareas
echo t > /proc/sysrq-trigger
dmesg | tail -100
# Mostrar uso de memoria
echo m > /proc/sysrq-trigger
# Mostrar registros y banderas de CPU
echo p > /proc/sysrq-trigger
Análisis profundo de red
# Capturar tráfico de red
tcpdump -i any -w /tmp/capture.pcap
# Analizar conexiones específicas
tcpdump -i any host server-ip and port 80
# Verificar inundaciones SYN
netstat -n | grep SYN_RECV | wc -l
# Monitorear tasas de conexión
watch -n 1 'ss -s'
Documentación y reportes
Crear informes de incidentes
Documenta tus hallazgos sistemáticamente:
# Informe de diagnóstico automatizado
cat > /usr/local/bin/diagnostic-report.sh << 'EOF'
#!/bin/bash
REPORT="/tmp/diagnostic-report-$(date +%Y%m%d-%H%M%S).txt"
echo "=== DIAGNOSTIC REPORT ===" > $REPORT
echo "Date: $(date)" >> $REPORT
echo "" >> $REPORT
echo "=== SYSTEM INFO ===" >> $REPORT
uname -a >> $REPORT
uptime >> $REPORT
echo "" >> $REPORT
echo "=== CPU USAGE ===" >> $REPORT
top -bn1 | head -20 >> $REPORT
echo "" >> $REPORT
echo "=== MEMORY USAGE ===" >> $REPORT
free -h >> $REPORT
echo "" >> $REPORT
echo "=== DISK USAGE ===" >> $REPORT
df -h >> $REPORT
echo "" >> $REPORT
echo "=== NETWORK CONNECTIONS ===" >> $REPORT
ss -s >> $REPORT
echo "" >> $REPORT
echo "=== SERVICE STATUS ===" >> $REPORT
systemctl --failed >> $REPORT
echo "" >> $REPORT
echo "=== RECENT ERRORS ===" >> $REPORT
journalctl -p err -n 50 --no-pager >> $REPORT
echo "Report saved to: $REPORT"
EOF
chmod +x /usr/local/bin/diagnostic-report.sh
Conclusión
La falta de respuesta del servidor es un problema crítico que requiere un diagnóstico sistemático y una resolución rápida. Siguiendo el enfoque metódico descrito en esta guía, puedes identificar rápidamente las causas raíz e implementar soluciones efectivas. La clave para una solución de problemas exitosa es:
- Mantén la calma y sé sistemático: Sigue los pasos de diagnóstico en orden
- Documenta todo: Mantén notas de lo que observas y pruebas
- Comprende tu línea base: Conoce cómo se ve lo normal para tus sistemas
- Implementa monitoreo: Detecta problemas antes de que se vuelvan críticos
- Practica la recuperación: Prueba tus procedimientos regularmente
- Automatiza donde sea posible: Usa scripts para tareas comunes
- Aprende de los incidentes: Revisa y mejora después de cada problema
El mantenimiento regular, el monitoreo proactivo y la comprensión de estos comandos de diagnóstico minimizarán el tiempo de inactividad y asegurarán una recuperación rápida cuando ocurran problemas. Recuerda que la prevención siempre es mejor que la cura, así que invierte tiempo en monitoreo adecuado, alertas y mecanismos de recuperación automatizados.
Mantén esta guía a mano, practica con estos comandos en situaciones no críticas y estarás bien preparado cuando te enfrentes a incidentes reales de falta de respuesta del servidor.


