

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

# Amazon EKS AWS Batch 上的 記憶體和 vCPU 考量事項
<a name="memory-cpu-batch-eks"></a>

在 Amazon EKS AWS Batch 的 中，您可以指定可供容器使用的資源。例如，您可以指定 vCPU 和記憶體資源的 `requests`或 `limits`值。

以下是指定 vCPU 資源的限制：
+ 至少必須指定一個 vCPU `requests`或`limits`值。
+ 一個 vCPU 單位等同於一個實體或虛擬核心。
+ vCPU 值必須以整數或增量 0.25 輸入。
+ 最小的有效 vCPU 值為 0.25。
+ 如果指定兩者，則`requests`值必須小於或等於`limits`值。如此一來，您就可以同時設定軟式和硬式 vCPU 組態。
+ vCPU 值無法以 milliCPU 格式指定。例如， `100m`不是有效的值。
+ AWS Batch 使用 `requests`值進行擴展決策。如果未指定`requests`值，則會將該`limits`值複製到該`requests`值。

以下是指定記憶體資源的限制：
+ 至少必須指定一個記憶體`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 共用。這可讓 AWS Batch Amazon EKS 使用執行個體類型的所有 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`和 1 GB 的記憶體`limits`值。

```
{
   "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 on Amazon EKS 任務 AWS Batch 轉譯為 Amazon EKS Pod 時， 會將`limits` 值 AWS Batch 複製到 `requests`值。如果未指定`requests`值，即為 。當您提交上述範例任務定義時，Pod `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 依賴 `bootstrap.sh` 檔案的預設邏輯進行 vCPU 和記憶體保留。如需 `bootstrap.sh` 檔案的詳細資訊，請參閱 https：//[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 保留值使用執行個體可用的 vCPUs 總數，以毫秒為單位計算。


| vCPU 號碼 | 預留百分比 | 
| --- | --- | 
| 1 | 6% | 
| 2 | 1% | 
| 3-4 | 0.5% | 
| 4 及更高版本 | 0.25% | 

使用上述值時，下列為 true：
+ 具有 2 個 vCPUs 之`c5.large`執行個體的 CPU 保留值為 70 公尺。計算方式如下：*(1\$160) \$1 (1\$110) = 70 公尺*。
+ 具有 96 個 vCPUs 之`c5.24xlarge`執行個體的 CPU 保留值為 310 公尺。計算方式如下：(1\$160) \$1 (1\$110) \$1 (2\$15) \$1 (92\$12.5) = 310 公尺。

在此範例中，有 1930 （計算值 2000-70) 微核心 vCPU 單位可用於在`c5.large`執行個體上執行任務。假設您的任務需要 `2`(2\$11000 公尺） vCPU 單位，則該任務不適用於單一`c5.large`執行個體。不過，需要 `1.75` vCPU 單位符合的任務。

## 範例：節點記憶體保留
<a name="memory-cpu-batch-eks-node-memory-reservations"></a>

記憶體保留值使用下列項目以 MB 為單位計算：
+ 執行個體容量，以 MB 為單位。例如，8 GB 執行個體為 7，748 MiB。
+ `kubeReserved` 值。`kubeReserved` 值是為系統協助程式預留的記憶體量。此`kubeReserved`值的計算方式如下：*((11 \$1 執行個體類型支援的 Pod 數量上限） \$1 255)*。如需執行個體類型支援的 Pod 數量上限的相關資訊，請參閱 [eni-max-pods.txt](https://github.com/awslabs/amazon-eks-ami/blob/main/nodeadm/internal/kubelet/eni-max-pods.txt) 
+ `HardEvictionLimit` 值。當可用的記憶體低於 `HardEvictionLimit`值時，執行個體會嘗試移出 Pod。

計算可配置記憶體的公式如下：(*instance\$1capacity\$1in\$1MiB*) - (11 \$1 (*maximum\$1number\$1of\$1pods*)) - 255 - (*`HardEvictionLimit` value.))。*

 `c5.large` 執行個體最多支援 29 個 Pod。對於`HardEvictionLimit`值為 100 MiB 的 8 GB `c5.large`執行個體，可配置記憶體為 7074MiB。計算方式如下：*(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 MiBDaemonSets。執行個體執行後， 會 AWS Batch 調整初始配置。
+ 如果 DaemonSet定義 vCPU 或記憶體限制，則 Amazon EKS 任務 AWS Batch 的資源較少。我們建議您盡可能減少指派給 AWS Batch 任務DaemonSets的 數量。