¿Cómo soluciono los errores OutOfMemory en Amazon ECS?
Mis tareas de Amazon Elastic Container Service (Amazon ECS) tienen problemas de uso de memoria. O bien, mis contenedores están saliendo debido a un error OutofMemory.
Descripción corta
Si tienes problemas de falta de memoria, Amazon ECS detiene la tarea y recibe el siguiente mensaje de error:
«OutOfMemoryError: Container killed due to memory usage».
Este problema se produce cuando los procesos del contenedor utilizan más memoria que la cantidad asignada en la definición de la tarea. Para resolver los problemas de OutofMemory, lleva a cabo las siguientes acciones de solución de problemas.
Resolución
Identificación de las tareas que Amazon ECS ha finalizado debido al agotamiento de la memoria
Para identificar las tareas que Amazon ECS ha finalizado debido al agotamiento de la memoria, sigue estos pasos:
- Comprueba las tareas detenidas en la consola de Amazon ECS.
- Busca tareas con códigos de salida 137 o 139 que suelen producirse cuando Amazon ECS experimenta errores relacionados con la memoria.
- Si encuentras problemas de memoria, comprueba los registros del agente de contenedor para ver si hay problemas de falta de memoria que hayan provocado la detención de la tarea.
Supervisión y análisis del uso de la memoria del contenedor
Para solucionar problemas de aplicaciones relacionados con la memoria, utiliza Registros de Amazon CloudWatch para analizar tus tareas. Utiliza Amazon ECS o la consola de CloudWatch para supervisar el uso de la memoria de servicio. Para obtener métricas de memoria específicas de contenedores, configura Información de contenedores de CloudWatch con una observabilidad mejorada.
Para analizar el uso de memoria de un contenedor a lo largo del tiempo, utiliza una consulta personalizada en Información de contenedores de CloudWatch.
Ejemplo de consulta:
stats max(MemoryUtilized) as mem, max(MemoryReserved ) as memreserved by bin (5m) as period, TaskId, ContainerName | sort period desc | filter ContainerName like "example-container-name" | filter TaskId = "example-task-id"
Nota: Sustituye example-container-name por el nombre del contenedor y example-task-id por el ID de la tarea.
Establecimiento de cuotas de memoria en la tarea y el contenedor de Amazon ECS
A nivel de tarea, puedes establecer una cuota de memoria estricta para toda la tarea. A nivel de contenedor, puedes usar los parámetros memoryReservation (límites flexibles de memoria) y memory (límites estrictos de memoria) para asignar memoria.
Antes de desplegar la aplicación, asegúrate de que el host tenga suficiente memoria disponible. A continuación, actualiza la definición de la tarea con cuotas de memoria flexibles y estrictas.
Nota: Solo puedes usar el parámetro memoryReservation en contenedores de Linux.
Ejemplo de definición de tarea:
"containerDefinitions": [ { "name": "example-container-name", "memory": 1024, "memoryReservation": 512 // ... other container properties } ]
Configuración del intercambio para contenedores que tengan grandes necesidades de memoria transitoria
Nota: Para usar los parámetros maxSwap y sharedMemorySize, tus tareas deben usar el tipo de inicio de Amazon Elastic Compute Cloud (Amazon EC2).
Si los contenedores experimentan picos de uso de memoria temporales elevados, actualiza la definición de la tarea para usar la configuración de intercambio. El intercambio reduce los errores OutofMemory que se producen durante los periodos de alta carga. Sin embargo, el intercambio también puede ralentizar la aplicación. Tras activar el intercambio, supervisa el rendimiento de la aplicación.
Ajuste de la configuración de memoria de la aplicación en función del marco de versión ejecutable
Es posible que las aplicaciones se detengan cuando alcanzan las cuotas de memoria predeterminadas del marco o de la versión ejecutable, incluso con memoria de sistema disponible o cuotas de contenedores aumentadas. Para solucionar este problema, supervisa los patrones de uso de memoria de la aplicación. Identifica la configuración de memoria predeterminada de tu marco o versión ejecutable y, a continuación, ajusta los parámetros de memoria de tareas para que se ajusten a los requisitos de tu aplicación.
Aplicaciones Java
La máquina virtual Java (JVM) requiere una asignación de memoria inicial del sistema operativo (SO) al inicio y tiene una cuota máxima de uso de memoria. Para obtener más información, consulta Error java.lang.OutOfMemoryError en el sitio web de Oracle. Para ajustar los valores de la memoria, utiliza los indicadores de JVM. Por ejemplo, ejecuta el siguiente comando para usar -Xms para establecer el tamaño inicial del montón y -Xmx para establecer el tamaño máximo del montón:
java -Xms512m -Xmx2048m -jar your-app.jar
Para activar el registro detallado de recopilación de elementos no utilizados (GC), agrega el siguiente argumento de JVM a tu comando de Java:
-verbose:gc -Xlog:gc*:file=log_filename:time,uptime:filecount=num_files,filesize=file_sizem
Para obtener más información, consulta Registros de recopilación de elementos no utilizados en el sitio web de Oracle.
Para realizar diagnósticos de memoria avanzados, utiliza jcmd o jmap para generar volcados de montones y herramientas de análisis como JDK Mission Control o VisualVM. Para obtener más información, consulta Datos de diagnóstico y Herramientas de análisis en el sitio web de Oracle.
Aplicaciones Node.js
Utiliza el siguiente módulo v8.getHeapStatistics() para comprobar la cuota de memoria del montón predeterminada:
const v8 = require('v8'); console.log(v8.getHeapStatistics());
Para obtener más información, consulta v8.getHeapStatistics() en el sitio web de Node.js.
Para aumentar la cuota de tamaño del montón, usa el parámetro --max-old-space-size cuando ejecutes la aplicación:
node --max-old-space-size=4096 app.js
Nota: El comando anterior establece una cuota de montón de 4 gigabytes (GB). El tamaño predeterminado de la memoria del montón puede variar según las diferentes versiones de Node.js. Para obtener más información, consulta --max-old-space-size=SIZE (in MiB) en el sitio web de Node.js.
Para realizar un seguimiento de la recopilación de elementos no utilizados, agrega el siguiente indicador al proceso del nodo:
node --trace-gc server.js
Para obtener más información, consulta Seguimiento de la recopilación de elementos no utilizados en el sitio web de Node.js.
Para realizar un diagnóstico exhaustivo de la memoria, utiliza los generadores de perfiles integrados de Node.js V8, como --heap-prof, para crear instantáneas de montones. O bien, utiliza --heapsnapshot-signal para usar señales de Linux para crear instantáneas de montones. Para obtener más información, consulta --heap-prof y Uso de instantáneas de montones en el sitio web de Node.js.
Escalamiento del servicio para optimizar el uso de la memoria a nivel de servicio
Para optimizar el uso de la memoria a nivel de servicio, supervisa y ajusta la asignación de recursos para escalar las tareas en función de los patrones de uso de la memoria. Calcula la memoria total que utilizan las tareas de servicio. A continuación, ajusta manualmente el valor de la tarea deseada en tu servicio en función de tus necesidades de memoria.
O bien, utiliza políticas de escalamiento de servicios basadas en las métricas de uso de la memoria. Configura las políticas de escalamiento con umbrales para escalar o desescalar horizontalmente.
Evitar futuros errores OutofMemory
Para evitar futuros errores OutofMemory, realiza una prueba de carga en el contenedor de un host o servidor para determinar las necesidades de memoria de la aplicación. Usa las estadísticas de los contenedores de Docker para supervisar el uso de memoria de los contenedores cuando realices las pruebas. Para obtener más información, consulta las estadísticas de contenedores de Docker en el sitio web de Docker.
Para actualizar la configuración del contenedor, realiza las siguientes acciones:
- Administra las estructuras de datos.
- Evita la creación innecesaria de objetos.
- Implementa el almacenamiento en caché.
- Utiliza algoritmos eficientes para reducir el consumo de memoria.
Información relacionada
- Temas
- Containers
- Etiquetas
- Amazon Elastic Container Service
- Idioma
- Español

Contenido relevante
preguntada hace 2 años
- Como solucionar el error: Supplied Policy document is breaching Cloudwatch Logs policy length limit.Respuesta aceptada
preguntada hace 2 años
preguntada hace 9 meses
preguntada hace 9 meses
OFICIAL DE AWSActualizada hace 2 años
OFICIAL DE AWSActualizada hace 8 meses