Wie behebe ich OutOfMemory-Fehler in Amazon ECS?

Letzte Aktualisierung: 16.09.2022

Ich möchte Probleme mit der Speicherauslastung in meiner Amazon-Elastic-Container-Service-Aufgabe (Amazon ECS) beheben.

-oder-

Die Container in meiner Amazon-ECS-Aufgabe werden aufgrund eines OutOfMemory-Fehlers beendet.

Kurzbeschreibung

Standardmäßig hat ein Container keine Ressourcenbeschränkungen und kann so viele Ressourcen verwenden, wie es der Kernel-Scheduler des Hosts zulässt. Mit Docker können Sie die Menge an Speicher steuern, die von einem Container verwendet wird. Achten Sie darauf, dass ein laufender Container nicht den größten Teil des Speichers des Host-Rechners verbraucht. Wenn der Kernel auf Linux-Hosts feststellt, dass nicht genügend Speicher vorhanden ist, um wichtige Systemfunktionen auszuführen, löst er eine OutOfMemory-Ausnahme aus und beendet die Prozesse, um Speicher freizugeben.

Mit Docker können Sie eine der folgenden Optionen verwenden:

  • Harte Speicherbeschränkungen, die es dem Container ermöglichen, nicht mehr als eine bestimmte Menge an Benutzer- oder Systemspeicher zu verwenden
  • Weiche Limits, die es dem Container ermöglichen, so viel Speicher wie erforderlich zu verwenden, sofern nicht bestimmte Bedingungen, wie z. B. wenig Speicher oder Konflikte auf dem Host-Computer, eintreten

Wenn eine Amazon-ECS-Aufgabe aufgrund von OutOfMemory-Problemen beendet wird, wird möglicherweise die folgende Fehlermeldung angezeigt:

OutOfMemoryError: Container killed due to memory usage

Sie erhalten diesen Fehler, wenn ein Container in Ihrer Aufgabe beendet wird, weil die Prozesse im Container mehr Speicher verbrauchen als die Menge, die in der Aufgabendefinition zugewiesen wurde.

Auflösung

Gehen Sie wie folgt vor, um OutOfMemory-Fehler in Ihrer Amazon-ECS-Aufgabe zu beheben:

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”

Gehen Sie wie folgt vor, um das Risiko einer Instabilität von Aufgaben aufgrund von OutOfMemory-Problemen zu minimieren:

  • Führen Sie Tests durch, um die Speicheranforderungen Ihrer Anwendung zu verstehen, bevor Sie die Anwendung in Produktion nehmen. Sie können einen Lasttest für den Container innerhalb eines Hosts oder Servers durchführen. Anschließend können Sie die Speicherauslastung der Container mithilfe von Docker-Statistiken überprüfen.
  • Stellen Sie sicher, dass Ihre Anwendung nur auf Hosts mit ausreichenden Ressourcen ausgeführt wird.
  • Beschränken Sie die Menge an Speicher, die Ihr Container verwenden kann. Sie können dies tun, indem Sie die entsprechenden Werte für das harte Limit und das weiche Limit für Ihre Container festlegen. Amazon ECS verwendet mehrere Parametern für die Zuweisung von Speicher zu Aufgaben: memoryReservation für Soft-Limit und Speicher für hartes Limit. Wenn Sie diese Werte angeben, werden sie von den verfügbaren Speicherressourcen für die Container-Instance abgezogen, auf der Container platziert ist.
    Hinweis: Der Parameter memoryReservation wird für Windows-Container nicht unterstützt.
  • Sie können swap für Container mit hohem transienten Speicherbedarf einschalten. Dadurch wird die Wahrscheinlichkeit von OutOfMemory-Fehlern verringert, wenn der Container unter hoher Last steht.
    Hinweis: Wenn Sie Aufgaben verwenden, die den Starttyp AWS Fargate verwenden, werden die Parameter maxSwap und sharedMemorySize nicht unterstützt.
    Wichtig: Achten Sie darauf, wenn Sie Swap auf Ihren Docker-Hosts konfigurieren. Das Einschalten von Swap kann Ihre Anwendung verlangsamen und die Leistung verringern. Diese Funktion verhindert jedoch, dass Ihrer Anwendung der Systemspeicher ausgeht.

Verwenden Sie die folgende AWS-CloudFormation-Vorlage, um Amazon-ECS-Aufgaben zu erkennen, die aufgrund von OutOfMemory-Ereignissen beendet wurden. Mit dieser Vorlage können Sie eine Amazon EventBridge-Regel, ein Amazon-Simple-Notification-Service-Thema (Amazon SNS) und eine Amazon-SNS-Themenrichtlinie erstellen. Wenn Sie die Vorlage ausführen, fragt die Vorlage nach einer E-Mail-Liste, einem Themennamen und einem Flag, um die Überwachung zu aktivieren oder zu deaktivieren.

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."

Nachdem Sie den CloudFormation-Stack erstellt haben, können Sie Ihre E-Mail-Adresse verifizieren, um das Abonnement zu bestätigen. Nachdem eine Aufgabe aufgrund eines OutOfMemory-Problems beendet wurde, erhalten Sie eine E-Mail mit einer Nachricht ähnlich der folgenden:

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

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?