Amazon ECS での OutOfMemory エラーをトラブルシューティングするにはどうすればよいですか。
Amazon Elastic Container Service (Amazon ECS) のタスクにおけるメモリ使用量の問題をトラブルシューティングしようと考えています。または、Amazon ECS タスク内のコンテナが「OutOfMemory」エラーにより終了しています。
簡単な説明
デフォルトでは、コンテナはリソースの制約がなく、ホストのカーネルスケジューラが許す限り多くのリソースを使用できます。Docker では、コンテナが使用するメモリの量を制御できます。実行中のコンテナがホストマシンのメモリ使用量の大半を占めないようにしてください。Linux ホストでは、重要なシステム機能を実行するのに十分なメモリがないことをカーネルが検出すると、OutOfMemory 例外が発生します。その場合は、プロセスを終了してメモリを解放します。
Docker では、次のメモリ制限のいずれかを使用できます。
- コンテナが一定量を超えてユーザーメモリまたはシステムメモリを使用できないようにするハードメモリ制限
- ホストマシンでのメモリ不足や競合など、特定の条件が発生しない限り、コンテナが必要なメモリを使用できるようにするソフト制限
OutOfMemory の問題により Amazon ECS タスクが終了すると、Amazon ECS コンソールに次のエラーメッセージが表示されることがあります。メッセージを表示するには、[タスク ID] を選択し、[詳細] セクションを参照してコンテナの詳細を表示します。
OutOfMemoryError: Container killed due to memory usage
この場合、コンテナのプロセスがタスク定義での割り当て量を超えてメモリを消費するため、タスク内のコンテナは終了します。
解決策
Amazon ECS タスクの OutOfMemory エラーをトラブルシューティングするには、以下の手順を実行します。
- Amazon ECS コンソールで、停止したタスクにエラーがないか確認します。[停止理由] フィールドでエラーコード OutOfMemory を確認します。
- タスクに対する Amazon CloudWatch Logs をオンにして、メモリ使用量が原因で発生するアプリケーションレベルの問題をデバッグします。
- Amazon ECS コンソールまたは CloudWatch コンソールのいずれかでサービスのメモリ使用量を表示します。
- CloudWatch Container Insights を使用してメモリ使用量をモニタリングします。特定のコンテナの一定期間にわたるメモリ使用量を表示するには、次の例のようなクエリを使用します。
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"
OutOfMemory の問題が原因でタスクが不安定になるリスクを軽減するには、次の手順を実行します。
- アプリケーションを本番環境に移行する前に、テストを実行してアプリケーションのメモリ要件を把握します。ホストまたはサーバー内のコンテナで負荷テストを実行できます。次に、(Docker Docs のウェブサイトから) docker stats を使用してコンテナのメモリ使用量を確認します。
- 必ず十分なリソースを備えたホストでのみ、アプリケーションを実行するようにします。
- コンテナが使用できるメモリの量を制限します。コンテナのハード制限とソフト制限に適切な値を設定します。Amazon ECS では、いくつかのパラメータを使用してタスクにメモリを割り当てます。memoryReservation はソフト制限用、memory はハード制限用です。これらの値を指定すると、コンテナがあるコンテナインスタンスの使用可能なメモリリソースからそれらの値が差し引かれます。注: memoryReservation パラメータは、Windows コンテナではサポートされていません。
- 一時的なメモリ需要が高いコンテナでは、スワップをオンにできます。そうすることで、コンテナに高い負荷がかかっているときに OutOfMemory エラーが発生する可能性が下がります。注: AWS Fargate 起動タイプを使用するタスクを使用している場合、パラメータ maxSwap と sharedMemorySize はサポートされていません。重要: Docker ホストでスワップを設定するときは注意が必要です。スワップをオンにすると、アプリケーションの動作が遅くなり、パフォーマンスが低下する可能性があります。しかし、この機能により、アプリケーションがシステムメモリを使い果たすのを防ぐことができます。
OutOfMemory イベントが原因で終了した Amazon ECS タスクを検出するには、次の AWS CloudFormation テンプレートを使用します。このテンプレートで、Amazon EventBridge ルール、Amazon Simple Notification Service (Amazon SNS)トピック、および Amazon SNS トピックポリシーを作成できます。テンプレートを実行すると、テンプレートはメールリスト、トピック名、および監視をオンまたはオフにするフラグを要求します。
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."
CloudFormation スタックを作成したら、メールを確認してサブスクリプションを確認します。OutOfMemory の問題でタスクが終了すると、次の例のようなメッセージが記載されたメールが届きます。
"Task 'arn:aws:ecs:eu-west-1:555555555555:task/ECSFargate/0123456789abcdef0123456789abcdef' was stopped due to OutOfMemory."
関連情報
コンテナの終了中に Amazon ECS タスクが停止したり、開始できなかったりする場合のトラブルシューティング方法を教えてください。
関連するコンテンツ
- 質問済み 6年前lg...
- 質問済み 6ヶ月前lg...
- 質問済み 3年前lg...
- AWS公式更新しました 2年前