Reserva de la memoria de instancias de contenedor de Linux de Amazon ECS
Cuando el agente de contenedor de Amazon ECS registra una instancia de contenedor en un clúster, el agente debe determinar la cantidad de memoria disponible que puede reservar la instancia de contenedor para las tareas. Debido a la sobrecarga de memoria de la plataforma y a la memoria ocupada por el kernel del sistema, este número difiere de la cantidad de memoria instalada que se anuncia para las instancias de Amazon EC2. Por ejemplo, una instancia m4.large tiene 8 GiB de memoria instalada. Sin embargo, esto no siempre significa que haya exactamente 8192 MiB de memoria disponible para las tareas cuando se registra la instancia de contenedor.
Determinación de recursos de memoria de Instancias administradas de ECS
Instancias administradas de Amazon ECS utiliza un enfoque jerárquico para determinar los requisitos de recursos de memoria para las tareas. A diferencia de ECS en EC2, que se basa en la introspección de memoria de Docker, Instancias administradas de ECS calcula los requisitos de memoria directamente a partir de la carga útil de la tarea durante las decisiones de programación.
Cuando el agente de Instancias administradas de ECS recibe una tarea, calcula las necesidades de memoria mediante el siguiente orden de prioridad:
-
Memoria a nivel de tarea (máxima prioridad): si se especifica memoria a nivel de tarea en la definición de la tarea, el agente utiliza este valor directamente. Esto tiene prioridad sobre todos los ajustes de memoria a nivel de contenedor.
-
Suma de memoria a nivel de contenedor (alternativa): si no se especifica la memoria a nivel de tarea (o es 0), el agente suma los requisitos de memoria de todos los contenedores de la tarea. Para cada contenedor, utiliza:
-
Reserva de memoria (límite flexible): si un contenedor especifica
memoryReservationen su configuración, el agente usa este valor. -
Memoria del contenedor (límite estricto): si
memoryReservationno se especifica, el agente utiliza el campomemorydel contenedor.
-
ejemplo Memoria a nivel de tarea especificada
Cuando se especifica la memoria a nivel de tarea, tiene prioridad sobre la configuración a nivel de contenedor:
{ "family": "my-task", "memory": "2048", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 } ] }
El agente reserva 2048 MiB (la memoria a nivel de tarea tiene prioridad).
ejemplo Memoria a nivel de contenedor con reservas
Cuando no se especifica la memoria a nivel de tarea, el agente suma los requisitos de memoria del contenedor:
{ "family": "my-task", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 }, { "name": "container2", "memory": 512 } ] }
El agente reserva 512 MiB (reserva de contenedor1) + 512 MiB (memoria de contenedor2) = 1024 MiB en total.
El agente de Instancias administradas de ECS realiza el cálculo de la memoria en tres fases:
-
Recepción de tareas: cuando la carga útil de una tarea llega desde el plano de control del ECS, el agente calcula inmediatamente la memoria requerida.
-
Almacenamiento de recursos: el requisito de memoria calculado se almacena en el modelo de tareas para su uso posterior en las operaciones de contabilidad de recursos.
-
Decisión de programación: antes de aceptar una tarea, el agente comprueba si hay suficiente memoria disponible. Si no hay suficiente memoria disponible, la tarea se rechaza y permanece en la cola de servicios de ECS hasta que haya recursos disponibles.
nota
A diferencia de ECS en EC2, Instancias administradas de ECS no utiliza la variable de configuración ECS_RESERVED_MEMORY. La reserva de memoria para los procesos del sistema se gestiona mediante la administración de recursos de la plataforma subyacente, y el agente lleva a cabo una contabilidad precisa de los recursos en función de las definiciones de las tareas.
Para ECS en EC2, el agente de contenedor de Amazon ECS proporciona una variable de configuración con el nombre ECS_RESERVED_MEMORY, que se puede utilizar para eliminar un número concreto de MiB de memoria del grupo asignado a las tareas. Este es un mecanismo eficaz que permite reservar memoria para los procesos críticos del sistema.
Si se ocupa toda la memoria de una instancia de contenedor con las tareas, es posible que las tareas compitan con los procesos críticos del sistema por la memoria y posiblemente inicien un error del sistema.
Por ejemplo, si se especifica ECS_RESERVED_MEMORY=256 en el archivo de configuración del agente, el agente registrará la memoria total menos 256 MiB de esa instancia y las tareas de ECS no podrán asignar 256 MiB de memoria. Para obtener más información sobre las variables de configuración del agente y cómo definirlas, consulte Configuración del agente de contenedor de Amazon ECS y Arranque de instancias de contenedor de Linux de Amazon ECS para la transferencia de datos.
Si especifica 8192 MiB para la tarea y ninguna de las instancias de contenedor tiene 8192 MiB o más de memoria disponible para satisfacer este requisito, la tarea no se puede ubicar en el clúster. Si utiliza un entorno informático administrado, AWS Batch debe iniciar un tipo de instancia de mayor tamaño para poder acomodar la solicitud.
El agente de contenedor de Amazon ECS utiliza la función ReadMemInfo() de Docker para consultar la memoria total disponible al sistema operativo. Tanto Linux como Windows cuentan con utilidades de línea de comandos para determinar la memoria total.
ejemplo - Determinar la memoria total en Linux
El comando free devuelve la memoria total reconocida por el sistema operativo.
$free -b
Ejemplo de la salida de una instancia m4.large que ejecuta la AMI de Amazon Linux optimizada para Amazon ECS.
total used free shared buffers cached Mem:8373026816348180480 8024846336 90112 25534464 205418496 -/+ buffers/cache: 117227520 8255799296
Esta instancia tiene 8 373 026 816 bytes de memoria total, lo que se traduce en 7 985 MiB disponibles para tareas.
ejemplo - Determinar la memoria total en Windows
El comando wmic devuelve la memoria total reconocida por el sistema operativo.
C:\>wmic ComputerSystem get TotalPhysicalMemory
Ejemplo de la salida de una instancia m4.large que ejecuta la AMI de Windows Server optimizada para Amazon ECS.
TotalPhysicalMemory8589524992
Esta instancia tiene 8 589 524 992 bytes de memoria total, lo que se traduce en 8 191 MiB disponibles para tareas.
Visualización de la memoria de instancias de contenedor
Puede consultar la cantidad de memoria que registra una instancia de contenedor a través de la consola de Amazon ECS (o mediante la operación de la API DescribeContainerInstances). Si, para intentar maximizar el uso de recursos, proporciona la mayor cantidad de memoria posible a las tareas para un determinado tipo de instancia, puede observar la memoria disponible para esa instancia de contenedor y, a continuación, asignar a las tareas esa cantidad de memoria.
Visualización de la memoria de la instancia de contenedor
Abra la consola en https://console.aws.amazon.com/ecs/v2
. -
En el panel de navegación, seleccione Clústeres y elija el clúster que aloja su instancia de contenedor.
-
Elija Infraestructura y, a continuación, en Instancias de contenedor, elija una instancia de contenedor.
-
En la sección Recursos, se muestra la memoria registrada y la memoria disponible para la instancia de contenedor.
El valor del campo Registrada corresponde a la memoria que la instancia de contenedor registró en Amazon ECS cuando se inició por primera vez, mientras que el valor del campo Disponible corresponde a la memoria que aún no se ha asignado a ninguna tarea.