Wie behebe ich OutOfMemory-Fehler in Amazon ECS?
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:
- Überprüfen Sie die angehaltene Aufgabe in der Amazon-ECS-Konsole auf Fehler. Überprüfen Sie das Feld Grund für den gestoppten Fehler auf OutOfMemory.
- Schalten Sie Amazon CloudWatch Logs für Ihre Aufgaben ein, um Probleme auf Anwendungsebene zu debuggen, die aufgrund der Speichernutzung auftreten.
- Zeigen Sie die Speichernutzung des Service entweder in der Amazon-ECS-Konsole oder in der CloudWatch-Konsole an.
- Verwenden Sie CloudWatch Container Insights, um die Speichernutzung zu überwachen. Sie können die Speichernutzung eines bestimmten Containers für einen bestimmten Zeitraum mit einer Abfrage ähnlich der folgenden anzeigen:
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."
Zugehörige Informationen
Wie kann ich Probleme beheben, durch die Container in meinen Amazon ECS-Aufgaben beendet werden?
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 3 Jahren