Script rápido para diagnosticar “congelaciones” en un servidor Linux
Este script lo construí iterando con una IA para capturar en un único snapshot el estado del servidor cuando noto que se congela. La salida la reviso yo y también se la paso a un modelo para que correlacione métricas y sugiera la causa probable con rapidez.
Objetivo
Reducir el tiempo entre síntoma y diagnóstico reuniendo en una sola ejecución carga, memoria, disco, I/O, procesos bloqueados, saturación de PHP-FPM/Apache, conexiones TCP y últimos errores de Apache.
Script
echo -e "\033[1;36m=== CARGA Y UPTIME ===\033[0m" && uptime && \
echo "" && echo -e "\033[1;36m=== MEMORIA ===\033[0m" && free -h && \
echo "" && echo -e "\033[1;36m=== DISCO ===\033[0m" && df -h / && \
echo "" && echo -e "\033[1;36m=== I/O DISCO (utilización %) ===\033[0m" && iostat -x 1 1 | grep -E "Device|loop0|dm-0" && \
echo "" && echo -e "\033[1;36m=== PROCESOS BLOQUEADOS (estado D) ===\033[0m" && ps aux | awk '$8 ~ /D/ {print $2, $8, $11, $10}' | head -20 && \
echo "" && echo -e "\033[1;36m=== CANTIDAD PROCESOS BLOQUEADOS ===\033[0m" && ps aux | awk '$8 ~ /D/' | wc -l && echo "procesos en estado D" && \
echo "" && echo -e "\033[1;36m=== TOP 10 PROCESOS POR CPU ===\033[0m" && ps aux --sort=-%cpu | head -11 && \
echo "" && echo -e "\033[1;36m=== TOP 10 PROCESOS POR MEMORIA ===\033[0m" && ps aux --sort=-%mem | head -11 && \
echo "" && echo -e "\033[1;36m=== PHP-FPM (total y bloqueados) ===\033[0m" && echo "Total PHP-FPM: $(ps aux | grep php-fpm | grep -v grep | wc -l)" && echo "Bloqueados: $(ps aux | grep php-fpm | awk '$8 ~ /D/' | wc -l)" && ps aux | grep php-fpm | grep -v grep && \
echo "" && echo -e "\033[1;36m=== APACHE ===\033[0m" && echo "Total Apache: $(ps aux | grep apache2 | grep -v grep | wc -l)" && \
echo "" && echo -e "\033[1;36m=== PROCESOS FIND ===\033[0m" && ps aux | grep find | grep -v grep && \
echo "" && echo -e "\033[1;36m=== CONEXIONES TCP ===\033[0m" && ss -s && \
echo "" && echo -e "\033[1;36m=== LOGS APACHE (últimos errores) ===\033[0m" && tail -5 /var/log/apache2/error.log 2>/dev/null || echo "No se puede leer error.log" && \
echo "" && echo -e "\033[1;36m=== SCRIPT LIMPIEZA ===\033[0m" && ps aux | grep cleanup | grep -v grep || echo "No hay script de limpieza ejecutándose" && \
echo "" && echo -e "\033[1;36m=== PROGRESO LIMPIEZA (últimas 10 líneas) ===\033[0m" && tail -10 /root/cleanup_progress.log 2>/dev/null || echo "No existe log de limpieza" Cómo interpretar rápido un “congelamiento”
- I/O saturado : procesos en estado D,
iostatcon%utilalto yawaitelevado. - PHP-FPM saturado : muchos workers, CPU alta en
php-fpmo backlog de peticiones. - Presión de memoria : swap activa y crecimiento de procesos, latencia extrema por swapping.
- Tormenta de conexiones :
ss -scon muchas conexiones y degradación general.
El valor del snapshot es la correlación: varias señales alineadas suelen apuntar al mismo cuello de botella y permiten priorizar la acción correctiva.