¿Por qué mi instancia de EC2 Linux deja de responder debido a la utilización excesiva de recursos?

7 minutos de lectura
0

Mi instancia de Linux de Amazon Elastic Compute Cloud (Amazon EC2) deja de responder debido a la utilización excesiva de recursos. ¿Cómo puedo evitarlo?

Descripción breve

Existen varias causas comunes por las que una instancia deja de responder:

  • Memoria: Las instancias EC2 no tienen espacio de intercambio asignado por defecto. Al quedarse sin memoria, se invoca al administrador de memoria insuficiente (OOM) de Linux. El OOM finaliza procesos, tales como una base de datos, un servidor web o el servicio SSH.
  • Red: Sin red, su sistema no puede responder a las solicitudes ARP de comprobación de estado. Cuando esto ocurre, su instancia no consigue comunicarse con otros hosts.
  • Operaciones de E/S: Sin E/S de disco, las instrucciones de lectura o escritura se bloquean. Por ejemplo, creación de archivos temporales, lecturas de bibliotecas del sistema o bases de datos.
  • CPU: Todas las tareas anteriores requieren tiempo de CPU para funcionar. Una utilización del 100 % de la CPU durante un tiempo prolongado impide al núcleo realizar las operaciones normales del sistema operativo.

Estos problemas también podrían acumularse en una especie de efecto bola de nieve. Por ejemplo, se queda sin memoria y el OOM detiene un proceso importante. Entonces, un segundo proceso que depende del primero que se ha detenido inicia un número mucho mayor de ciclos de CPU. Si la tarea está relacionada con el disco, el ciclo podría agotar también el volumen de Amazon Elastic Block Store (Amazon EBS). Además, el problema podría transferirse a una instancia diferente que esté esperando comunicación por parte de la instancia que no responde.

Resolución

Si su sistema tiene una utilización elevada de la CPU, o a menudo deja de responder debido a una utilización excesiva de los recursos, haga lo siguiente:

Recopile información

Supervise la utilización de la CPU mediante Amazon CloudWatch

Utilice una herramienta de supervisión como Amazon CloudWatch para observar tendencias y patrones de utilización elevada de recursos.

Utilice herramientas de supervisión del sistema

Si tiene varios servicios y no está seguro de cuál está utilizando recursos en exceso, instale una utilidad como atop. También puede utilizar herramientas como htop, top, y sar. Todas estas herramientas ayudan a identificar los procesos que utilizan más CPU. Para más información, consulte:

Obtenga más información sobre el proceso que está utilizando una CPU elevada

Utilice el comando pidstat o ps para obtener información más detallada sobre el proceso. La información proporcionada en la salida del comando le ayuda a determinar si el proceso es de sistema o de usuario. Para más información sobre cómo configurar y utilizar las herramientas necesarias para ejecutar estos comandos, consulte lo siguiente:

  • pidstat(1) en la página del manual de Linux
  • ps(1) en la página del manual de Linux

Compruebe los registros del sistema

Compruebe los errores o advertencias relacionados con una utilización elevada de la CPU. Por ejemplo, utilice el comando dmesg para ver los mensajes del núcleo y consulte los archivos /var/log/syslog o /var/log/messages para los mensajes del sistema. El resultado del comando y el contenido del archivo de registro ayudan a identificar los problemas del sistema o de la aplicación que están causando problemas.

Revise el historial de comandos

Revise el historial de comandos para ver si ha habido un error humano. El historial de comandos se encuentra normalmente en el archivo ~/.bash_history.

Compruebe si hay trabajos programados

Compruebe si hay trabajos programados o trabajos cron ejecutándose en la instancia EC2 que podrían causar un uso elevado de la CPU. En primer lugar, confirme la hora de la utilización elevada de la CPU. A continuación, ejecute el siguiente comando para listar los trabajos cron:

sudo crontab -l
sudo cat /etc/crontab
sudo cat crontab -l -u <username>

El comando anterior muestra la configuración crontab para el usuario root. Incluya la opción -u en el comando para comprobar el cron de un usuario específico. A continuación, localice la hora en la que observó el problema. Compruebe sus registros incluyendo lo siguiente:

/var/log/messages
/var/log/syslog
/var/log/dmesg
/var/log/cron.log

Utilice el comando grep para filtrar las entradas relevantes para los trabajos cron específicos que desee investigar. Confirme si se han producido errores relacionados con alguno de los trabajos cron identificados.

Compruebe la utilización de la memoria

Una utilización elevada de la memoria podría provocar una utilización elevada de la CPU debido a la utilización del espacio de intercambio. Utilice el comando free para comprobar la utilización de la memoria. Para más información sobre cómo configurar y utilizar las herramientas necesarias, consulte Disección del comando free en el sitio web redhat.com.

Compruebe el tráfico de red

Un tráfico de red elevado podría causar una utilización elevada de la CPU, especialmente si la instancia está gestionando muchas peticiones de red. Utilice el comando iftop para supervisar el tráfico de red y considere la posibilidad de optimizar la configuración de su red o actualizar su tipo de instancia si es necesario. Para más información sobre cómo configurar y utilizar las herramientas necesarias, consulte Análisis de interfaces Linux bajo pedido con iftop en el sitio web redhat.com.

Compruebe la E/S del disco

Una E/S de disco elevada podría causar una utilización elevada de la CPU. Utilice el comando iostat para supervisar la E/S del disco e identificar cualquier proceso que pueda causar una E/S elevada. Para más información, consulte Informes de E/S desde la línea de comandos de Linux en el sitio web redhat.com.

Actúe en función de los datos adquiridos

Optimice el código

Si su aplicación está provocando una utilización elevada de la CPU, optimice su código. Para ello, identifique y elimine los cuellos de botella en el rendimiento. Las herramientas de perfilado como perf o strace ayudan a identificar el código problemático. Para más información sobre cómo configurar y utilizar las herramientas necesarias, consulte lo siguiente:

Actualice su instancia

Si sus procesos están utilizando muchos recursos por razones válidas, como un número elevado de usuarios, considere la posibilidad de actualizar su instancia.

AWS Compute Optimizer puede ayudarle a decidir el tipo de instancia y el tamaño adecuados que debe utilizar. También puede considerar la posibilidad de escalar horizontalmente utilizando Amazon EC2 Auto Scaling.

Configure las reglas de auditoría de Linux

Si desea más transparencia respecto a los comandos de usuario y los cambios de configuración, puede configurar el sistema de auditoría de Linux para que realice un seguimiento de los cambios.

Prevenga la utilización excesiva en el futuro

  1. Antes de desplegar una nueva aplicación en producción, cree un entorno de prueba y realice una evaluación comparativa para determinar la computación, la memoria, el EBS y la red necesarios. Despliegue de acuerdo con sus puntos de referencia, al tiempo que construye para la tolerancia a fallos. Para más información, consulte: 
    Diseñe interacciones en un sistema distribuido para evitar fallos
    Tutorial: Configurar una aplicación escalada y con carga equilibrada
  2. Asegúrese de que las aplicaciones que se ejecutan en la instancia están optimizadas para el rendimiento. La optimización implica modificar los archivos de configuración, optimizar las consultas a la base de datos u optimizar el código.
  3. Si su aplicación tiene muchas bases de datos, considere la posibilidad de implementar el almacenamiento en caché para reducir el número de consultas a la base de datos.
  4. Asegúrese de que su software está actualizado con los últimos parches de seguridad y correcciones de errores. El software obsoleto puede causar problemas de rendimiento y vulnerabilidades que conducen a una alta utilización de la CPU.
  5. Si su aplicación recibe un gran volumen de tráfico, considere la posibilidad de utilizar un equilibrador de carga para distribuir el tráfico entre varias instancias EC2. Un equilibrador de carga reduce la utilización de la CPU en cualquier instancia.
  6. Continúe supervisando sus instancias y cree alarmas para determinados umbrales de utilización de recursos.
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 10 meses