Comment résoudre les erreurs OutOfMemory dans Amazon ECS ?

Dernière mise à jour : 16/09/2022

Je souhaite résoudre les problèmes d'utilisation de la mémoire dans ma tâche Amazon Elastic Container Service (Amazon ECS).

-ou-

Les conteneurs de ma tâche Amazon ECS quittent en raison d'une erreur OutOfMemory.

Brève description

Par défaut, un conteneur n'a aucune contrainte de ressource et peut utiliser autant de ressources que le planificateur du noyau de l'hôte le permet. Avec Docker, vous pouvez contrôler la quantité de mémoire utilisée par un conteneur. Veillez à ne pas permettre à un conteneur en cours d'exécution de consommer la majeure partie de la mémoire de la machine hôte. Sur les hôtes Linux, lorsque le noyau détecte que la mémoire est insuffisante pour effectuer des fonctions système importantes, il génère une exception OutOfMemory et met fin aux processus pour libérer de la mémoire.

Avec Docker, vous utiliser l'une des options suivantes :

  • Limites de mémoire stricte qui permettent au conteneur de ne pas utiliser plus d'une certaine quantité de mémoire utilisateur ou système
  • Limites flexibles qui permettent au conteneur d'utiliser autant de mémoire que nécessaire, sauf si certaines conditions, telles qu'un manque de mémoire ou un conflit sur la machine hôte, se produisent

Lorsqu'une tâche Amazon ECS est terminée en raison de problèmes de mémoire insuffisante, le message d'erreur suivant peut s'afficher :

OutOfMemoryError: Container killed due to memory usage

Cette erreur s'affiche lorsqu'un conteneur de votre tâche quitte, car les processus qu'il contient consomment plus de mémoire que la quantité allouée dans la définition de la tâche.

Solution

Pour résoudre les erreurs OutOfMemory dans votre tâche Amazon ECS, procédez comme suit :

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”

Pour atténuer le risque d'instabilité des tâches en raison de problèmes de mémoire insuffisante, procédez comme suit :

  • Effectuez des tests pour comprendre les besoins en mémoire de votre application avant de la mettre en production. Vous pouvez effectuer un test de charge sur le conteneur au sein d'un hôte ou d'un serveur. Ensuite, vous pouvez vérifier l'utilisation de la mémoire des conteneurs à l'aide de Docker Stats.
  • Assurez-vous que votre application ne s'exécute que sur des hôtes disposant de ressources appropriées.
  • Limitez la quantité de mémoire que votre conteneur peut utiliser. Pour ce faire, définissez des valeurs appropriées pour la limite stricte et la limite flexible pour vos conteneurs. Amazon ECS utilise deux paramètres pour allouer de la mémoire aux tâches : memoryReservation pour la limite flexible et memory pour la limite stricte. Si vous spécifiez ces valeurs, elles sont soustraites des ressources de mémoire disponibles pour l'instance de conteneur où se trouve le conteneur.
    Remarque : le paramètre memoryReservation n'est pas pris en charge pour les conteneurs Windows.
  • Vous pouvez activer la permutation pour les conteneurs dont la demande de mémoire transitoire est élevée. Cela réduit le risque d'erreurs OutOfMemory lorsque le conteneur est soumis à une charge élevée.
    Remarque : si vous utilisez des tâches qui utilisent le type de lancement AWS Fargate, les paramètresmaxSwap et sharedMemorySize ne sont pas pris en charge.
    Important : configurez avec précaution la permutation sur vos hôtes Docker. L'activation de la permutation peut ralentir votre application et réduire les performances. Toutefois, cette fonction empêche votre application de manquer de mémoire système.

Pour détecter les tâches Amazon ECS qui ont été interrompues en raison d'événements OutOfMemory, utilisez le modèle AWS CloudFormation suivant. Ce modèle vous permet de créer une règle Amazon EventBridge, une rubrique Amazon Simple Notification Service (Amazon SNS) et une politique relative aux rubriques Amazon SNS. Lorsque vous exécutez le modèle, celui-ci demande une liste d'e-mails, un nom de sujet et un indicateur pour activer ou désactiver la surveillance.

AWSTemplateFormatVersion: 2010-09-09
Description: >
        - Monitor OOM Stopped Tasks with EventBridge rules with AWS CloudFormation.

Parameters:
  EmailList:
    Type: String
    Description: "Email to notify!"
    AllowedPattern: '[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+'
    Default: "mail@example.com"

  SNSTopicName:
    Type: String
    Description: "Name for the notification topic."
    AllowedPattern: '[a-zA-Z0-9_-]+'
    Default: "oom-monitoring-topic"

  MonitorStatus:
    Type: String
    Description: "Enable / Disable monitor."
    AllowedValues:
      - ENABLED
      - DISABLED
    Default: ENABLED

Resources:
  SNSMonitoringTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref EmailList
          Protocol: email
      TopicName: !Sub ${AWS::StackName}-${SNSTopicName}
      
  SNSMonitoringTopicTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      Topics:
        - !Ref SNSMonitoringTopic
      PolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Sid: SnsOOMTopicPolicy
            Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: [  'sns:Publish' ]
            Resource: !Ref SNSMonitoringTopic
          - Sid: AllowAccessToTopicOwner
            Effect: Allow
            Principal:
              AWS: '*'
            Action: [  'sns:GetTopicAttributes',
                       'sns:SetTopicAttributes',
                       'sns:AddPermission',
                       'sns:RemovePermission',
                       'sns:DeleteTopic',
                       'sns:Subscribe',
                       'sns:ListSubscriptionsByTopic',
                       'sns:Publish',
                       'sns:Receive' ]
            Resource: !Ref SNSMonitoringTopic
            Condition:
              StringEquals:
                'AWS:SourceOwner': !Ref 'AWS::AccountId'
          
  EventRule:
    Type: AWS::Events::Rule
    Properties:
      Name: ECSStoppedTasksEvent
      Description: Triggered when an Amazon ECS Task is stopped
      EventPattern:
        source:
          - aws.ecs
        detail-type:
          - ECS Task State Change
        detail:
          desiredStatus:
            - STOPPED
          lastStatus:
            - STOPPED
          containers:
            reason:
              - prefix: "OutOfMemory"
      State: !Ref MonitorStatus
      Targets:
        - Arn: !Ref SNSMonitoringTopic
          Id: ECSOOMStoppedTasks
          InputTransformer:
            InputPathsMap:
              taskArn: $.detail.taskArn
            InputTemplate: >
                "Task '<taskArn>' was stopped due to OutOfMemory."

Après avoir créé la pile CloudFormation, vous pouvez confirmer votre adresse e-mail pour valider l'abonnement. Lorsqu'une tâche est terminée en raison d'un problème OutOfMemory, vous recevez un e-mail contenant un message similaire au suivant :

"Task 'arn:aws:ecs:eu-west-1:555555555555:task/ECSFargate/0123456789abcdef0123456789abcdef' was stopped due to OutOfMemory."

Cet article vous a-t-il été utile ?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?