如何對 Amazon ECS 中出現的 OutOfMemory 錯誤進行疑難排解?

上次更新日期︰2022 年 3 月 17 日

我想對 Amazon Elastic Container Service (Amazon ECS) 任務中出現的記憶體用量問題進行疑難排解。

-或-

由於 OutOfMemory 錯誤,我的 Amazon ECS 任務中的容器正在退出。

簡短描述

依預設,容器沒有資源限制,並且可使用主機內核排程器允許的資源。使用 Docker,您可以控制容器使用的記憶體量。請務必不要允許運行中容器佔用主機的大部分記憶體。在 Linux 主機上,當內核偵測到記憶體不足,無法執行重要的系統功能時,會引發 OutOfMemory 異常狀況,並開始結束進程以釋放記憶體。

使用 Docker,您可以選擇使用以下任一選項:

  • 硬記憶體限制,允許容器使用不超過一定量的使用者或系統記憶體
  • 軟限制,允許容器視需使用盡可能多的記憶體,除非發生某些情況 (如記憶體不足或主機上的爭用)

當 Amazon ECS 任務因 OutOfMemory 問題而結束時,您可能會收到以下錯誤訊息:

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 統計資料檢查容器的記憶體用量。
  • 確保應用程式僅在具有足夠資源的主機上執行。
  • 限制容器可使用的記憶體量。您可以為容器設定適當的硬限制和軟限制值,來完成此操作。Amazon ECS 使用幾項參數來將記憶體分配給任務:memoryReservation 用於軟限制,memory 用於硬限制。指定這些值後,將會從容器所在的容器執行個體可用記憶體資源中減去這些值。
    注意:Windows 容器不支援 memoryReservation 參數。
  • 您可以為具有較高暫時性記憶體需求的容器開啟 swap (交換) 功能。這樣做可以減少容器在較高負載下出現 OutOfMemory 錯誤的機率。
    注意:如果您使用的任務採用 AWS Fargate 啟動類型,則不支援 maxSwapsharedMemorySize 參數。
    重要提示:在 Docker 主機上設定交換時要謹慎。開啟交換可能會減慢應用程式並降低效能。但是,此功能可防止應用程式耗盡系統記憶體。

此文章是否有幫助?


您是否需要帳單或技術支援?