保留 Amazon ECS Linux 容器執行個體記憶體 - Amazon Elastic Container Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

保留 Amazon ECS Linux 容器執行個體記憶體

當 Amazon ECS 容器代理程式將容器執行個體註冊至叢集時,代理程式必須判斷容器執行個體有多少記憶體可保留給您的任務。由於存在平台記憶體額外負荷和由系統核心佔用的記憶體,這數字會與 Amazon EC2 執行個體公告的安裝記憶體數量不同。舉例而言,m4.large 執行個體安裝了 8 GiB 的記憶體。但在容器執行個體註冊時,未必恰好有 8192 MiB 的記憶體可供任務使用。

ECS 受管執行個體記憶體資源判斷

Amazon ECS 受管執行個體使用階層方法來判斷任務的記憶體資源需求。與依賴 Docker 記憶體自我檢查的 EC2 上的 ECS 不同,ECS 受管執行個體會在排程決策期間直接從任務承載計算記憶體需求。

當 ECS 受管執行個體代理程式收到任務時,它會使用以下優先順序計算記憶體需求:

  1. 任務層級記憶體 (最高優先順序) - 如果任務層級記憶體是在任務定義中指定,代理程式會直接使用此值。這優先於所有容器層級的記憶體設定。

  2. 容器層級記憶體總和 (備用) - 如果未指定任務層級記憶體 (或為 0),代理程式會加總任務中所有容器的記憶體需求。對於每個容器,它使用:

    1. 記憶體保留 (軟性限制) - 如果容器在其組態memoryReservation中指定 ,代理程式會使用此值。

    2. 容器記憶體 (硬性限制) - 如果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 受管執行個體代理程式會分三個階段執行記憶體計算:

  1. 任務接收 - 當任務承載從 ECS 控制平面抵達時,代理程式會立即計算所需的記憶體。

  2. 資源儲存 - 計算的記憶體需求會存放在任務模型中,以供日後在資源會計操作中使用。

  3. 排程決策 - 在接受任務之前,客服人員會檢查是否有足夠記憶體可用。如果可用的記憶體不足,任務會遭到拒絕,並保留在 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: 8373026816 348180480 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 執行個體的輸出範例。

TotalPhysicalMemory 8589524992

執行個體的記憶體總量有 8589524992 位元組,轉為任務可使用的記憶體則有 8191 MiB。

檢視容器執行個體記憶體

您可以在 Amazon ECS 主控台中檢視容器執行個體註冊的記憶體量 (也可以使用 DescribeContainerInstances API 操作)。若要為特定執行個體類型的任務提供盡可能多的記憶體,以最大化資源使用率,您可以觀察該容器執行個體有多少可用的記憶體量,然後再向任務指派盡可能多的記憶體。

檢視容器執行個體記憶體
  1. 開啟主控台,網址為 https://console.aws.amazon.com/ecs/v2

  2. 在導覽窗格中選擇叢集,再選取託管容器執行個體的叢集。

  3. 選擇基礎結構,然後在容器執行個體下選擇容器執行個體。

  4. 資源區段會顯示容器執行個體的已註冊和可使用的記憶體。

    已註冊的記憶體值是容器執行個體首次啟動時向 Amazon ECS 註冊的記憶體量,而可用記憶體的值則是尚未分配給任務的記憶體量。