Réservation de mémoire pour une instance de conteneur Amazon ECS Linux - Amazon Elastic Container Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Réservation de mémoire pour une instance de conteneur Amazon ECS Linux

Lorsque l’agent de conteneur Amazon ECS enregistre une instance de conteneur dans un cluster, il doit déterminer la quantité de mémoire disponible que l’instance de conteneur peut réserver pour vos tâches. En raison de la surcharge de mémoire de la plate-forme et de la mémoire occupée par le noyau du système, ce nombre est différent de la quantité de mémoire installée annoncée pour les EC2 instances Amazon. Par exemple, une instance m4.large a 8 Gio de mémoire installée. Toutefois, cela n’équivaut pas toujours exactement à 8 192 Mio de mémoire disponible pour les tâches lorsque l’instance de conteneur s’enregistre.

Détermination des ressources de mémoire des instances gérées ECS

Les instances gérées Amazon ECS utilisent une approche hiérarchique pour déterminer les besoins en ressources de mémoire pour les tâches. Contrairement à ECS EC2 , qui repose sur l'introspection de la mémoire de Docker, ECS Managed Instances calcule les besoins en mémoire directement à partir de la charge utile des tâches lors des décisions de planification.

Lorsque l'agent ECS Managed Instances reçoit une tâche, il calcule la mémoire requise en utilisant l'ordre de priorité suivant :

  1. Mémoire au niveau des tâches (priorité la plus élevée) : si la mémoire au niveau des tâches est spécifiée dans la définition des tâches, l'agent utilise directement cette valeur. Cela a priorité sur tous les paramètres de mémoire au niveau du conteneur.

  2. Somme de mémoire au niveau du conteneur (solution de secours) : si la mémoire au niveau de la tâche n'est pas spécifiée (ou vaut 0), l'agent fait la somme des besoins en mémoire de tous les conteneurs de la tâche. Pour chaque contenant, il utilise :

    1. Réservation de mémoire (limite souple) : si un conteneur le spécifie memoryReservation dans sa configuration, l'agent utilise cette valeur.

    2. Mémoire du conteneur (limite stricte) - Si memoryReservation ce n'est pas spécifié, l'agent utilise le memory champ du conteneur.

Exemple Mémoire au niveau des tâches spécifiée

Lorsque la mémoire au niveau des tâches est spécifiée, elle a priorité sur les paramètres au niveau du conteneur :

{ "family": "my-task", "memory": "2048", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 } ] }

L'agent réserve 2048 MiB (la mémoire au niveau des tâches est prioritaire).

Exemple Mémoire au niveau du conteneur avec réservations

Lorsque la mémoire au niveau des tâches n'est pas spécifiée, l'agent additionne les besoins en mémoire du conteneur :

{ "family": "my-task", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 }, { "name": "container2", "memory": 512 } ] }

L'agent réserve 512 Mo (réservation conteneur1) + 512 Mo (conteneur2 mémoire) = 1024 Mo au total.

L'agent ECS Managed Instances effectue le calcul de la mémoire en trois phases :

  1. Réception de tâches - Lorsqu'une charge utile de tâche arrive depuis le plan de contrôle ECS, l'agent calcule immédiatement la mémoire requise.

  2. Stockage des ressources - La mémoire requise calculée est stockée dans le modèle de tâche pour être utilisée ultérieurement dans les opérations de comptabilité des ressources.

  3. Décision de planification - Avant d'accepter une tâche, l'agent vérifie si suffisamment de mémoire est disponible. Si la mémoire disponible est insuffisante, la tâche est rejetée et reste dans la file d'attente du service ECS jusqu'à ce que les ressources soient disponibles.

Note

Contrairement à ECS activé EC2, ECS Managed Instances n'utilise pas la variable ECS_RESERVED_MEMORY de configuration. La réservation de mémoire pour les processus du système est gérée par le biais de la gestion des ressources de la plate-forme sous-jacente, et l'agent effectue une comptabilité précise des ressources en fonction des définitions de tâches.

Pour ECS activé EC2, l'agent de conteneur Amazon ECS fournit une variable de configuration appeléeECS_RESERVED_MEMORY, que vous pouvez utiliser pour supprimer un nombre spécifié de MiB de mémoire du pool alloué à vos tâches. Cela réserve de manière effective cette quantité de mémoire pour les processus système critiques.

Si vous occupez la totalité de la mémoire sur une instance de conteneur avec vos tâches, il est alors possible que vos tâches se disputent la mémoire avec les processus système critiques, ce qui peut provoquer une défaillance du système.

Par exemple, si vous spécifiez ECS_RESERVED_MEMORY=256 dans votre fichier de configuration de l'agent de conteneur, l'agent enregistre la mémoire totale, moins 256 Mio pour cette instance. 256 Mio de mémoire ne sont donc pas allouées par des tâches ECS. Pour plus d'informations sur les variables de configuration de l'agent et la façon de les définir, consultez Configuration de l'agent de conteneur Amazon ECS et Démarrage des instances de conteneurs Amazon ECS Linux pour transmettre des données.

Si vous spécifiez 8 192 Mio pour la tâche et qu’aucune de vos instances de conteneur ne dispose d’au moins 8 192 Mio de mémoire disponible pour répondre à cette exigence, la tâche ne peut pas être placée dans votre cluster. Si vous utilisez un environnement informatique géré, vous AWS Batch devez lancer un type d'instance plus important pour répondre à la demande.

L'agent de conteneur Amazon ECS utilise la fonction ReadMemInfo() Docker pour connaître la mémoire totale disponible pour le système d'exploitation. Linux et Windows fournissent tous deux des utilitaires de ligne de commande pour déterminer la mémoire totale.

Exemple - Déterminer la mémoire totale Linux

La commande free renvoie la mémoire totale reconnue par le système d'exploitation.

$ free -b

Exemple de sortie d'une instance m4.large exécutant l'AMI Amazon Linux optimisée pour Amazon ECS.

total used free shared buffers cached Mem: 8373026816 348180480 8024846336 90112 25534464 205418496 -/+ buffers/cache: 117227520 8255799296

Cette instance comporte 8373026816 octets de mémoire totale, soit 7 985 Mio disponible pour les tâches.

Exemple - Déterminer la mémoire totale Windows

La commande wmic renvoie la mémoire totale reconnue par le système d'exploitation.

C:\> wmic ComputerSystem get TotalPhysicalMemory

Exemple de sortie d’une instance m4.large exécutant l’AMI Windows Server optimisée pour Amazon ECS.

TotalPhysicalMemory 8589524992

Cette instance comporte 8589524992 octets de mémoire totale, soit 8 191 Mio disponible pour les tâches.

Affichage de la mémoire d’une instance de conteneur

Vous pouvez voir la quantité de mémoire utilisée par une instance de conteneur dans la console Amazon ECS (ou dans le cadre de l'opération DescribeContainerInstancesAPI). Si vous essayez d’optimiser l’utilisation de vos ressources en fournissant à vos tâches autant de mémoire que possible pour un type d’instance particulier, vous pouvez observer la mémoire disponible pour cette instance de conteneur, puis attribuer autant de mémoire à vos tâches.

Pour afficher la mémoire d’une instance de conteneur
  1. Ouvrez la console à la https://console.aws.amazon.com/ecs/version 2.

  2. Dans le panneau de navigation, choisissez Clusters, puis sélectionnez le cluster qui héberge votre instance de conteneur.

  3. Choisissez Infrastructure, puis sous les instances de conteneur, choisissez une instance de conteneur.

  4. La section Ressources indique la mémoire enregistrée et la mémoire disponible pour l’instance de conteneur.

    La valeur de mémoire Enregistrée correspond à l’instance de conteneur enregistrée auprès d’Amazon ECS lors de son premier lancement, tandis que la valeur de mémoire Disponible correspond à la mémoire qui n’a pas encore été allouée à des tâches.