

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

# 保留 Amazon ECS Linux 容器執行個體記憶體
<a name="memory-management"></a>

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

## ECS 受管執行個體記憶體資源判斷
<a name="ecs-mi-memory-calculation"></a>

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

ECS 受管執行個體代理程式收到任務時，會使用下列優先順序來計算記憶體需求：

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

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

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

   1. *容器記憶體 （硬性限制）* - 如果`memoryReservation`未指定，代理程式會使用容器`memory`的欄位。

**Example 指定的任務層級記憶體**  
指定任務層級記憶體時，其優先順序會高於容器層級設定：  

```
{
  "family": "my-task",
  "memory": "2048",
  "containerDefinitions": [
    {
      "name": "container1",
      "memory": 1024,
      "memoryReservation": 512
    }
  ]
}
```
代理程式保留 2048 MiB （任務層級記憶體優先）。

**Example 具有保留的容器層級記憶體**  
未指定任務層級記憶體時，代理程式會加總容器記憶體需求：  

```
{
  "family": "my-task",
  "containerDefinitions": [
    {
      "name": "container1",
      "memory": 1024,
      "memoryReservation": 512
    },
    {
      "name": "container2",
      "memory": 512
    }
  ]
}
```
代理程式保留 512 MiB （容器 1 保留） \$1 512 MiB （容器 2 記憶體） = 總計 1024 MiB。

ECS 受管執行個體代理程式會分三個階段執行記憶體計算：

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

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

1. **排程決策** - 在接受任務之前，客服人員會檢查是否有足夠記憶體可用。如果可用的記憶體不足，任務會遭到拒絕，並保留在 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 容器代理程式組態](ecs-agent-config.md) 和 [引導 Amazon ECS Linux 容器執行個體傳遞資料](bootstrap_container_instance.md)。

若指定 8192 MiB 供任務使用，而您沒有任何容器執行個體擁有 8192 MiB 或更多記憶體可滿足此需求，則任務便無法置放到叢集中。如果您使用的是受管運算環境，則 AWS Batch 必須啟動較大的執行個體類型以容納請求。

Amazon ECS 容器代理程式會使用 Docker `ReadMemInfo()` 函數來查詢作業系統可用的記憶體總量。Linux 和 Windows 均有提供命令列公用程式來判斷記憶體總量。

**Example - 判定 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。

**Example - 判定 Windows 記憶體總量**  
**wmic** 命令會傳回作業系統辨識出的記憶體總量。  

```
C:\> wmic ComputerSystem get TotalPhysicalMemory
```
執行 Amazon ECS 最佳化 Windows Server AMI 的 `m4.large` 執行個體的輸出範例。  

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

## 檢視容器執行個體記憶體
<a name="viewing-memory"></a>

您可以在 Amazon ECS 主控台中檢視容器執行個體註冊的記憶體量 (也可以使用 [DescribeContainerInstances](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeContainerInstances.html) API 操作)。若要為特定執行個體類型的任務提供盡可能多的記憶體，以最大化資源使用率，您可以觀察該容器執行個體有多少可用的記憶體量，然後再向任務指派盡可能多的記憶體。

**檢視容器執行個體記憶體**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

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

1. 選擇**基礎結構**，然後在容器執行個體下選擇容器執行個體。

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

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