Amazon ECS での OutOfMemory エラーをトラブルシューティングするにはどうすればよいですか。

所要時間2分
0

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 エラーをトラブルシューティングするには、以下の手順を実行します。

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 起動タイプを使用するタスクを使用している場合、パラメータ maxSwapsharedMemorySize はサポートされていません。重要: 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 タスクが停止したり、開始できなかったりする場合のトラブルシューティング方法を教えてください。

AWS公式
AWS公式更新しました 9ヶ月前
コメントはありません