Amazon EKS の AWS Batch におけるメモリと vCPU に関する考慮事項
Amazon EKSのAWS Batchでは、コンテナで使用できるリソースを指定できます。例えば、vCPU とメモリリソースの requests 値、または limits 値を指定できます。
vCPU リソースを指定する際の制約は次のとおりです:
-
少なくとも 1つのvCPU
requests、またはlimits値 のいずれか指定する必要があります。 -
1つのvCPU ユニットは、1つの物理コアまたは仮想コアに相当します。
-
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値にコピーされます。
例: ジョブ定義
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とメモリの予約
AWS Batch は、vCPU とメモリの予約に関してbootstrap.shファイルのデフォルトロジックに依存します。bootstrap.sh ファイルの詳細については、bootstrap.sh
注記
実行中のインスタンスがない場合、vCPUとメモリの予約が最初にAWS Batchスケーリングロジックと意思決定に影響を与える可能性があります。インスタンスが実行されたら、AWS Batch は初期割り当てを調整します。
例: ノード CPU 予約
CPU 予約値は、インスタンスで使用可能な vCPU の総数を使用してミリコア単位で計算されます。
| vCPU番号 | 予約率 |
|---|---|
| 1 | 6% |
| 2 | 1% |
| 3~4 | 0.5% |
| 4以上 | 0.25% |
上記の値を使用すると、次のようになります:
-
仮想CPUが2つある
c5.largeインスタンスのvCPUs予約値は,70 m です。これは次の方法で計算されます:(1*60) + (1*10) = 70 m。 -
96個のvCPUsを搭載した
c5.24xlargeインスタンスのCPU予約値は、 310 mです。これは次の方法で計算されます:(1*60) + (1*10) + (2*5) + (92*2.5) = 310 m。
この例では、c5.large インスタンスでジョブを実行するために使用できるミリコアvCPU ユニットは、1930(計算は2000-70) です。ジョブに 2 (2*1000 m) の vCPU ユニットが必要で、そのジョブが 単一のc5.large インスタンスに収まらないとします。ただし、1.75 vCPU ユニットが必要なジョブには適しています。
例: ノードメモリ予約
メモリ予約値は、以下を使用してメビバイト単位で計算されます:
-
インスタンスキャパシティーは MB 単位です。例えば、8 GB のインスタンスは 7,748 です MiB。
-
kubeReserved値。kubeReserved値は、システムデーモン用に確保するメモリ量です。kubeReserved値は次のように計算されます: ((11 * インスタンスタイプでサポートされる最大ポッド数) + 255)。各インスタンスタイプによりサポートされるポッドの最大数のリストは、GitHub のeni-max-pods.txtを参照してください。 -
HardEvictionLimit値。使用可能なメモリがHardEvictionLimit値を下回ると、インスタンスはポッドを削除しようとします。
割り当て可能なメモリの計算式は次のとおりです:(Instance_Capacity_IN_MIB)-(11 * (最大ポッド数))-255-( ))。HardEvictionLimit 値。
1つの c5.large インスタンスは最大29個のポッドをサポートします。HardEvictionLimit 値が100 MiBの8 GB c5.large インスタンスの場合、割り当て可能なメモリは7074ですMiB。これは次の方法で計算されます: (7748-(11 * 29) -255 -100) = 7074 MiB。この例では、8,192件のMiB のタスクジョブは 、8 gibibyte (GiB) インスタンスであるにもかかわらず、このインスタンスには当てはまりません。
DaemonSets
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 の数は、できるだけ少なくすることをお勧めします。