本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
保留 Amazon ECS Linux 容器執行個體記憶體
當 Amazon ECS 容器代理程式將容器執行個體註冊至叢集時,代理程式必須判斷容器執行個體有多少記憶體可保留給您的任務。由於存在平台記憶體額外負荷和由系統核心佔用的記憶體,這數字會與 Amazon EC2 執行個體公告的安裝記憶體數量不同。舉例而言,m4.large 執行個體安裝了 8 GiB 的記憶體。但在容器執行個體註冊時,未必恰好有 8192 MiB 的記憶體可供任務使用。
ECS 受管執行個體記憶體資源判斷
Amazon ECS 受管執行個體使用階層方法來判斷任務的記憶體資源需求。與依賴 Docker 記憶體自我檢查的 EC2 上的 ECS 不同,ECS 受管執行個體會在排程決策期間直接從任務承載計算記憶體需求。
當 ECS 受管執行個體代理程式收到任務時,它會使用以下優先順序計算記憶體需求:
-
任務層級記憶體 (最高優先順序) - 如果任務層級記憶體是在任務定義中指定,代理程式會直接使用此值。這優先於所有容器層級的記憶體設定。
-
容器層級記憶體總和 (備用) - 如果未指定任務層級記憶體 (或為 0),代理程式會加總任務中所有容器的記憶體需求。對於每個容器,它使用:
-
記憶體保留 (軟性限制) - 如果容器在其組態
memoryReservation中指定 ,代理程式會使用此值。 -
容器記憶體 (硬性限制) - 如果
memoryReservation未指定,代理程式會使用容器memory的欄位。
-
範例 指定的任務層級記憶體
指定任務層級記憶體時,其優先順序會高於容器層級設定:
{ "family": "my-task", "memory": "2048", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 } ] }
代理程式保留 2048 MiB (任務層級記憶體優先)。
範例 具有保留的容器層級記憶體
未指定任務層級記憶體時,代理程式會加總容器記憶體需求:
{ "family": "my-task", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 }, { "name": "container2", "memory": 512 } ] }
代理程式保留 512 MiB (容器 1 保留) + 512 MiB (容器 2 記憶體) = 總計 1024 MiB。
ECS 受管執行個體代理程式會分三個階段執行記憶體計算:
-
任務接收 - 當任務承載從 ECS 控制平面抵達時,代理程式會立即計算所需的記憶體。
-
資源儲存 - 計算的記憶體需求會存放在任務模型中,以供日後在資源會計操作中使用。
-
排程決策 - 在接受任務之前,客服人員會檢查是否有足夠記憶體可用。如果可用的記憶體不足,任務會遭到拒絕,並保留在 ECS 服務佇列中,直到資源可用為止。
注意
與 EC2 上的 ECS 不同,ECS 受管執行個體不使用 ECS_RESERVED_MEMORY 組態變數。系統程序的記憶體保留是透過基礎平台的資源管理來處理,代理程式會根據任務定義執行準確的資源會計。
對於 EC2 上的 ECS,Amazon ECS 容器代理程式提供名為 的組態變數ECS_RESERVED_MEMORY,您可以使用它從配置給您任務 MiB 的集區中移除指定數量的記憶體。這可為重要系統程序有效地預留記憶體。
若您的任務佔用了容器執行個體上的所有記憶體,任務可能會與重要的系統程序爭奪記憶體,也許會引發系統故障。
舉例而言,若在容器代理程式檔案中指定 ECS_RESERVED_MEMORY=256,則代理程式會將記憶體總量減去 256 MiB 再註冊給該執行個體,而 256 MiB 的記憶體就無法由 ECS 任務配置。如需代理程式組態變數的詳細資訊及設定方式,請參閱 Amazon ECS 容器代理程式組態 和 引導 Amazon ECS Linux 容器執行個體傳遞資料。
若指定 8192 MiB 供任務使用,而您沒有任何容器執行個體擁有 8192 MiB 或更多記憶體可滿足此需求,則任務便無法置放到叢集中。如果您使用的是受管運算環境,則 AWS Batch 必須啟動較大的執行個體類型以容納請求。
Amazon ECS 容器代理程式會使用 Docker ReadMemInfo() 函數來查詢作業系統可用的記憶體總量。Linux 和 Windows 均有提供命令列公用程式來判斷記憶體總量。
範例 - 判定 Linux 記憶體總量
free 命令會傳回作業系統辨識出的記憶體總量。
$free -b
執行 Amazon ECS 最佳化 Amazon Linux AMI 的 m4.large 執行個體的輸出範例。
total used free shared buffers cached Mem:8373026816348180480 8024846336 90112 25534464 205418496 -/+ buffers/cache: 117227520 8255799296
執行個體的記憶體總量有 8373026816 位元組,轉為任務可使用的記憶體則有 7985 MiB。
範例 - 判定 Windows 記憶體總量
wmic 命令會傳回作業系統辨識出的記憶體總量。
C:\>wmic ComputerSystem get TotalPhysicalMemory
執行 Amazon ECS 最佳化 Windows Server AMI 的 m4.large 執行個體的輸出範例。
TotalPhysicalMemory8589524992
執行個體的記憶體總量有 8589524992 位元組,轉為任務可使用的記憶體則有 8191 MiB。
檢視容器執行個體記憶體
您可以在 Amazon ECS 主控台中檢視容器執行個體註冊的記憶體量 (也可以使用 DescribeContainerInstances API 操作)。若要為特定執行個體類型的任務提供盡可能多的記憶體,以最大化資源使用率,您可以觀察該容器執行個體有多少可用的記憶體量,然後再向任務指派盡可能多的記憶體。
檢視容器執行個體記憶體
開啟主控台,網址為 https://console.aws.amazon.com/ecs/v2
。 -
在導覽窗格中選擇叢集,再選取託管容器執行個體的叢集。
-
選擇基礎結構,然後在容器執行個體下選擇容器執行個體。
-
資源區段會顯示容器執行個體的已註冊和可使用的記憶體。
已註冊的記憶體值是容器執行個體首次啟動時向 Amazon ECS 註冊的記憶體量,而可用記憶體的值則是尚未分配給任務的記憶體量。