

# 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 (container1 予約) \$1 512 MiB (container2 メモリ) = 合計 1024 MiB を予約します。

ECS マネージドインスタンスのエージェントは、次の 3 つのフェーズでメモリ計算を実行します。

1. **タスク受信** – ECS コントロールプレーンからタスクペイロードが到着すると、エージェントは直ちに必要なメモリを計算します。

1. **リソースストレージ** – 計算されたメモリ要件は、後でリソースの課金オペレーションで使用するため、タスクモデルに保存されます。

1. **スケジュールの決定** – タスクを受け入れる前に、エージェントは十分なメモリが使用可能かどうかを確認します。メモリが不足している場合タスクは拒否され、リソースが利用可能になるまで ECS サービスキューに残留します。

**注記**  
EC2 の ECS とは異なり、ECS マネージドインスタンスは `ECS_RESERVED_MEMORY` の設定変数を使用しません。システムプロセスのメモリ予約は、基盤となるプラットフォームのリソース管理を通じて処理され、エージェントはタスク定義に基づいて正確なリソースの課金を実行します。

 EC2 上の ECS の場合、Amazon ECS コンテナエージェントには、タスクに割り当てられたプールから指定したメモリ容量 (MiB) を削除するのに使用できる、`ECS_RESERVED_MEMORY` という設定変数があります。これにより、重要なシステムプロセスのメモリを効果的に確保することができます。

タスクでコンテナインスタンスのすべてのメモリを占有している場合、メモリが不可欠なシステムプロセスとタスクが競合し、システム障害が発生する可能性があります。

例えば、コンテナエージェント設定ファイルで `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 の初回起動時に登録されたときのコンテナインスタンスのメモリの値で、**[利用可能]** メモリの値は、まだ タスクに割り当てられていないメモリの値です。