Problema

Los nodos Proxmox pueden llegar a “congelarse” completamente: la máquina deja de responder a ping, el puerto HDMI no genera señal y solo la única salida es un corte de energía. El síntoma aparece después de varias decenas de horas de uptime y no deja rastro evidente en los logs. Este patrón no es exclusivo de una configuración específica; se reporta en servidores con CPUs Intel de 10ª‑12ª generación, NVMe PCIe, RAM DDR4 y placas base que soportan ASPM. El objetivo es proporcionar un método sistemático para aislar la causa y volver a un estado estable sin depender de pruebas aleatorias.

Causa

Los hard freezes en entornos virtualizados suelen derivar de tres áreas principales:

  1. Errores de enlace PCIe

    • Correcciones de errores (AER) en dispositivos NVMe, controladoras de red o GPU integrada indican problemas de señal, timing o incompatibilidad de ASPM.
    • La combinación de un SSD M.2 y una GPU iGPU en la misma raíz PCIe puede generar interferencias cuando el BIOS habilita “Active State Power Management” (ASPM) por defecto.
  2. Fallos de memoria o controladores de RAM

    • Memtest86+ que finaliza sin errores no descarta completamente problemas intermitentes; la prueba solo cubre patrones estáticos y puede pasar por alto errores bajo carga de CPU/IO.
    • Configuraciones de frecuencia y latencia fuera de los límites del módulo (XMP activado en BIOS) pueden provocar errores que aparecen solo bajo estrés prolongado.
  3. Firmware/BIOS y configuración de energía

    • Versiones de BIOS que no gestionan correctamente los estados C‑states o el “Thermal Design Power” (TDP) de CPUs de bajo consumo (ej. 11700T) pueden disparar “thermal throttling” que lleva a un lock‑up del controlador de interrupciones.
    • Opciones como “Intel SpeedStep”, “Turbo Boost” o “C‑State” mal implementadas generan picos de temperatura que el disipador no disipa a tiempo, provocando un apagado parcial del controlador de hardware.

En la práctica, la mayoría de los congelamientos se resuelven al atacar la capa PCIe y la gestión de energía, porque son los puntos donde hardware y kernel interactúan de forma más delicada.

Solución

1. Desactivar ASPM y forzar la inicialización del PCIe

Editar el arranque de GRUB para añadir los siguientes parámetros:

GRUB_CMDLINE_LINUX_DEFAULT="quiet pcie_aspm=off pci=noaer"
  • pcie_aspm=off elimina los cambios de estado de energía en los enlaces PCIe, evitando errores de “Receiver ID”.
  • pci=noaer suprime la generación de mensajes AER que pueden saturar el log y, en casos extremos, bloquear la interrupción del controlador.

Después de modificar /etc/default/grub, ejecutar:

update-grub && reboot

2. Verificar y actualizar firmware

  • BIOS: Instalar la última versión disponible del fabricante. En la sección de “Advanced → Power Management” desactivar C‑States (C1E, C6) y Turbo Boost.
  • SSD NVMe: Ejecutar smartctl -a /dev/nvme0 y buscar “Critical Warning”. Si aparecen, actualizar el firmware del SSD desde el sitio del vendor.

3. Probar la memoria bajo carga real

En lugar de depender solo de memtest, lanzar un stress test que combine CPU, RAM e I/O:

apt-get install stress-ng
stress-ng --vm 4 --vm-bytes 75% --timeout 6h --metrics-brief

Observar si el sistema se congela antes de que finalice el test. Si ocurre, bajar la frecuencia de la RAM en BIOS (desactivar XMP) y volver a probar.

4. Aislar dispositivos PCIe

  • Reasignar slots: Mover el SSD M.2 a un puerto PCIe de segunda generación (si la placa lo permite) o usar un adaptador USB‑NVMe para descartar el controlador interno.
  • Desconectar periféricos: Retirar la GPU integrada (desactivar iGPU en BIOS) y validar si el freeze persiste. En muchos casos, la iGPU comparte el mismo controlador de enlace que el NVMe y genera colisiones.

5. Ajustar la gestión térmica

  • Configurar un “fan curve” más agresiva en el BIOS o mediante lm-sensors y fancontrol.
  • Verificar la temperatura de la CPU y del SSD con sensors y nvme smart-log. Si la CPU supera 85 °C de forma sostenida, considerar mejorar la refrigeración o reducir el TDP mediante intel_pstate=disable y usar el governor “powersave”.

6. Revisión de logs y watchdog

  • Habilitar el kernel watchdog (echo 1 > /proc/sys/kernel/watchdog) para que, en caso de lock‑up, el kernel intente reiniciar el proceso antes de requerir un power‑cycle.
  • Configurar systemd para que capture el último kernel panic con kernel.panic=10 y kernel.panic_on_oops=1. Los mensajes aparecerán en journalctl -b -1.

Cuándo aplicar esta solución

  • Síntomas: Congelación total después de 24‑48 h, sin respuesta a ping, HDMI sin señal, logs sin errores críticos.
  • Entorno: Proxmox VE (cualquier versión), hardware con NVMe PCIe y CPU Intel de última generación, BIOS configurable.
  • No aplica: Si el nodo muestra mensajes de kernel panic claros (e.g., “Oops” o “BUG”) o si el hardware es un servidor blade sin acceso a BIOS/PCIe. En esos casos, la depuración se centra en el kernel y los contenedores.

Código

# 1. Añadir parámetros al arranque
sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="quiet pcie_aspm=off pci=noaer"/' /etc/default/grub
update-grub

# 2. Ejecutar stress-ng con métricas
apt-get update && apt-get install -y stress-ng
stress-ng --vm 4 --vm-bytes 75% --timeout 6h --metrics-brief

# 3. Habilitar watchdog y panic handling
echo 1 > /proc/sys/kernel/watchdog
sysctl -w kernel.panic=10
sysctl -w kernel.panic_on_oops=1

Verificación

  1. Reboot y comprobar que dmesg | grep -i aermsg no muestra entradas nuevas.
  2. Ejecutar stress-ng durante al menos 6 h; si el sistema permanece accesible, la causa probable estaba en ASPM o en la configuración de energía.
  3. Revisar journalctl -b -1 después de cualquier reinicio inesperado; la ausencia de “soft lockup” o “hard lockup” confirma que el watchdog está funcionando.
  4. Monitorear temperaturas con watch sensors y confirmar que la CPU se mantiene bajo 80 °C bajo carga sostenida.

Notas adicionales

  • En placas que no permiten desactivar C‑States, usar intel_idle.max_cstate=1 como parámetro de kernel puede ser una alternativa.
  • Si el SSD sigue generando AER aunque esté en modo “off”, probar con un controlador SATA tradicional elimina la variable PCIe por completo.
  • Algunos usuarios reportan que la combinación de una tarjeta de red Intel X550‑T y un NVMe en el mismo dominio PCIe genera “PCIe Bus Error” bajo carga de red; mover la NIC a un slot PCIe dedicado suele resolverlo.
  • Mantener siempre una copia de seguridad de la configuración de GRUB antes de modificarla: cp /etc/default/grub /etc/default/grub.bak.

Con este enfoque estructurado, la mayoría de los hard freezes en nodos Proxmox pueden identificarse y corregirse sin necesidad de reemplazar hardware de forma indiscriminada.