Amazon ECS における OutOfMemory エラーのトラブルシューティング方法を教えてください。

最終更新日: 2022 年 3 月 17 日

Amazon Elastic Container Service (Amazon ECS) タスクのメモリ使用量の問題をトラブルシューティングしたいです。

- または -

OutOfMemory エラーのため、Amazon ECS タスクのコンテナが終了しています。

簡単な説明

デフォルトでは、コンテナにリソースの制約がないため、ホストのカーネルスケジューラが許可する限りのリソースを使用できます。Docker では、コンテナの使用するメモリ量を制御できます。実行中のコンテナがホストマシンのメモリの大部分を消費しないようにしてください。Linux ホストは、カーネルが重要なシステム機能を実行するのに十分なメモリーがないことを検出すると、 OutOfMemory の例外をスローし、メモリーを解放するためにプロセスを終了し始めます。

Docker では、次のいずれかを選択できます:

  • コンテナが一定量以上のユーザーメモリまたはシステムメモリを使用できないようにするハードメモリ制限
  • メモリ不足やホストマシンでの競合などの特定の条件が発生しない限り、コンテナが必要なだけメモリを使用できるようにするソフトリミット

OutOfMemory の問題により Amazon ECS タスクが終了すると、次のエラーメッセージが表示されることがあります:

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 statsでコンテナのメモリ使用量を確認できます。
  • アプリケーションは、十分なリソースがあるホストでのみ実行されるようにしてください。
  • コンテナが使用できるメモリ量を制限します。コンテナのハード制限とソフト制限に適切な値を設定すると、これが実行できます。Amazon ECS では、memoryReservation (ソフト制限) および memory (ハード制限) という 2 つのパラメータを使用してタスクにメモリを割り当てます。これらの値を指定した場合、コンテナが配置されているコンテナインスタンスの使用可能なメモリリソースからこれらの値は減算されます。
    注:パラメータ memoryReservation は、Windows コンテナでサポートされていません。
  • 一時的なメモリ需要が高いコンテナでは、スワップをオンにできます。これにより、コンテナに高い負荷がかかっていても、OutOfMemory エラーが発生する可能性が低くなります。
    注:AWS Fargate 起動タイプのタスクを使用している場合、パラメータ maxSwap および sharedMemorySizeはサポートされません。
    重要:Docker ホストでスワップを設定する際には注意が必要です。スワップをオンにすると、アプリケーションの速度が低下し、パフォーマンスが低下する可能性があります。ただし、この機能により、アプリケーションのシステムメモリ不足を防ぐことができます。