

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EKS の AWS Batch におけるメモリと vCPU に関する考慮事項
<a name="memory-cpu-batch-eks"></a>

Amazon EKSのAWS Batchでは、コンテナで使用できるリソースを指定できます。例えば、vCPU とメモリリソースの `requests` 値、または `limits` 値を指定できます。

vCPU リソースを指定する際の制約は次のとおりです：
+ 少なくとも 1つのvCPU`requests`、または`limits`値 のいずれか指定する必要があります。
+ １つのvCPU ユニットは、１つの物理コアまたは仮想コアに相当します。
+ vCPUの値は、整数または0.25単位で入力する必要があります。
+ 有効な最小値は0.25です。
+ 両方が特定される場合、`requests`の値は`limits`の値以下でなくてはなりません。このようにして、ソフトとハードのvCPU設定の両方を行うことができます。
+ vCPU値をミリCPU形式で指定することはできません。例えば、`100m` は有効な値ではありません。
+ AWS Batch は、この `requests` 値をスケーリングの決定に使用します。`requests` 値が指定されていない場合、`limits` 値は `requests` 値にコピーされます。

メモリリソースを指定する際の制約は、次のとおりです：
+ 少なくとも1つのメモリ`requests` または `limits` 値を指定する必要があります。
+ メモリ値は mebibytes (MiBs) 内である必要があります。
+ 両方を指定する場合、`requests` 値は `limits` 値と等しくなければなりません。
+ AWS Batch は、この `requests` 値をスケーリングの決定に使用します。`requests` 値が指定されていない場合、`limits` 値は `requests` 値にコピーされます。

GPUリソースを指定する際の制約は、次のとおりです：
+ 両方を指定する場合、`requests` 値は`limits` 値と等しくなければなりません。
+ AWS Batchは、この `requests` 値をスケーリングの決定に使用します。`requests` 値が指定されていない場合、`limits` 値は `requests` 値にコピーされます。

## 例: ジョブ定義
<a name="memory-cpu-batch-eks-example-job-definition"></a>

Amazon EKS ジョブ定義の以下の AWS Batch では、ソフト vCPU 共有を設定します。これにより、Amazon EKS のAWS Batchは、インスタンスタイプの vCPU容量のすべて使用できるようになります。ただし、実行中の他のジョブがある場合、そのジョブには最大数の `2` vCPUs が割り当てられます。メモリは、2 GBに制限されています。

```
{
   "jobDefinitionName": "MyJobOnEks_Sleep",
   "type": "container",
   "eksProperties": {
       "podProperties": {
           "containers": [
               {
                   "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
                   "command": ["sleep", "60"],
                   "resources": {
                       "requests": {
                           "cpu": "2",
                           "memory": "2048Mi"
                       }
                   }
               }
           ]
       }
   }
}
```

Amazon EKS AWS Batch の以下のジョブ定義の`request` 値は `1` で、最大の `4` vCPUs をジョブに割り当てます。

```
{
   "jobDefinitionName": "MyJobOnEks_Sleep",
   "type": "container",
   "eksProperties": {
       "podProperties": {
           "containers": [
               {
                   "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
                   "command": ["sleep", "60"],
                   "resources": {
                       "requests": {
                           "cpu": "1"
                       },
                       "limits": {
                           "cpu": "4",
                           "memory": "2048Mi"
                       }
                   }
               }
           ]
       }
   }
}
```

以下のAmazon EKS のAWS Batchジョブ定義では 、vCPU `limits` 値をに `1`を、メモリ `limits` 値を 1 GB に設定します。

```
{
   "jobDefinitionName": "MyJobOnEks_Sleep",
   "type": "container",
   "eksProperties": {
       "podProperties": {
           "containers": [
               {
                   "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
                   "command": ["sleep", "60"],
                   "resources": {
                       "limits": {
                           "cpu": "1",
                           "memory": "1024Mi"
                       }
                   }
               }
           ]
       }
   }
}
```

AWS Batch Amazon EKS 上のジョブを Amazon EKS ポッドにAWS Batch 変換するときに、AWS Batch `limits` 値をその `requests` 値にコピーします。これは、`requests` 値が指定されていない場合です。前述のジョブ定義の例を送信すると、ポッド`spec` は次のようになります。

```
apiVersion: v1
kind: Pod
...
spec:
  ...
  containers:
    - command:
        - sleep
        - 60
      image: public.ecr.aws/amazonlinux/amazonlinux:2
      resources:
        limits:
          cpu: 1
          memory: 1024Mi
        requests:
          cpu: 1
          memory: 1024Mi
      ...
```

## ノードCPUとメモリの予約
<a name="memory-cpu-batch-eks-node-cpu-memory-reservations"></a>

AWS Batch は、vCPU とメモリの予約に関して`bootstrap.sh`ファイルのデフォルトロジックに依存します。`bootstrap.sh` ファイルの詳細については、[bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh) を参照してください。vCPUメモリリソースのサイズを決定する場合、以下の例を検討してください。

**注記**  
実行中のインスタンスがない場合、vCPUとメモリの予約が最初にAWS Batchスケーリングロジックと意思決定に影響を与える可能性があります。インスタンスが実行されたら、AWS Batch は初期割り当てを調整します。

## 例: ノード CPU 予約
<a name="memory-cpu-batch-eks-node-cpu-reservations"></a>

CPU 予約値は、インスタンスで使用可能な vCPU の総数を使用してミリコア単位で計算されます。


| vCPU番号 | 予約率 | 
| --- | --- | 
| 1 | 6% | 
| 2 | 1% | 
| 3～4 | 0.5% | 
| 4以上 | 0.25% | 

上記の値を使用すると、次のようになります:
+ 仮想CPUが2つある `c5.large` インスタンスのvCPUs予約値は,70 m です。これは次の方法で計算されます：*(1\$160) \$1 (1\$110) = 70 m*。
+ 96個のvCPUsを搭載した`c5.24xlarge` インスタンスのCPU予約値は、 310 mです。これは次の方法で計算されます：(1\$160) \$1 (1\$110) \$1 (2\$15) \$1 (92\$12.5) = 310 m。

この例では、`c5.large` インスタンスでジョブを実行するために使用できるミリコアvCPU ユニットは、1930（計算は2000－70) です。ジョブに `2` (2\$11000 m) の vCPU ユニットが必要で、そのジョブが 単一の`c5.large` インスタンスに収まらないとします。ただし、`1.75` vCPU ユニットが必要なジョブには適しています。

## 例: ノードメモリ予約
<a name="memory-cpu-batch-eks-node-memory-reservations"></a>

メモリ予約値は、以下を使用してメビバイト単位で計算されます:
+ インスタンスキャパシティーは MB 単位です。例えば、8 GB のインスタンスは 7,748 です MiB。
+ `kubeReserved` 値。`kubeReserved` 値は、システムデーモン用に確保するメモリ量です。`kubeReserved` 値は次のように計算されます: *((11 \$1 インスタンスタイプでサポートされる最大ポッド数) \$1 255)*。各インスタンスタイプによりサポートされるポッドの最大数のリストは、GitHub の[eni-max-pods.txt](https://github.com/awslabs/amazon-eks-ami/blob/main/nodeadm/internal/kubelet/eni-max-pods.txt)を参照してください。
+ `HardEvictionLimit` 値。使用可能なメモリが`HardEvictionLimit` 値を下回ると、インスタンスはポッドを削除しようとします。

割り当て可能なメモリの計算式は次のとおりです：(*Instance\$1Capacity\$1IN\$1MIB*)-(11 \$1 (*最大ポッド数*))-255-(* `HardEvictionLimit` 値。* ))。

 1つの `c5.large` インスタンスは最大29個のポッドをサポートします。`HardEvictionLimit` 値が100 MiBの8 GB `c5.large` インスタンスの場合、割り当て可能なメモリは7074ですMiB。これは次の方法で計算されます: *(7748-(11 \$1 29) -255 -100) = 7074 MiB*。この例では、8,192件のMiB のタスクジョブは 、8 gibibyte (GiB) インスタンスであるにもかかわらず、このインスタンスには当てはまりません。

## DaemonSets
<a name="memory-cpu-batch-eks-reservations-daemonset-scaling"></a>

DaemonSets を使用する場合は、以下を考慮してください：
+ Amazon EKS インスタンスでAWS Batchがまったく実行されていない場合、最初はDaemonSets AWS Batch のスケーリングロジックと意思決定に影響する可能性があります。AWS Batchは最初に0.5 のvCPU ユニットと、500 MiB を想定されるDaemonSetsに割り当てます。インスタンス実行されたら、AWS Batchは初期割り当てを調整します。
+ DaemonSetがvCPUまたはメモリの制限を定義している場合、Amazon EKSジョブのAWS Batchが少なくなります。AWS Batchジョブに割り当てられる DaemonSets の数は、できるだけ少なくすることをお勧めします。