亚马逊 EKSAmazon Batch 上的内存和 vCPU 注意事项 - Amazon Batch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

亚马逊 EKSAmazon Batch 上的内存和 vCPU 注意事项

Amazon Batch在 Amazon EKS 上,您可以指定可供容器使用的资源。例如,您可以为 vCPU 和内存资源指定requestslimits值。

以下是指定 vCPU 资源的限制:

  • 必须指定至少一个 vCPUrequestslimits值。

  • 一个 vCPU 单元等同于一个物理或虚拟内核。

  • vCPU 值必须以整数或以 0.25 为增量输入。

  • 最小的有效 vCPU 值为 0.25。

  • 如果同时指定的,该requests值必须小于或等于该limits值。这样,您可以配置软和硬 vCPU 配置。

  • 无法以 milliCPU 形式指定 vCPU 值。例如,100m不是有效值。

  • Amazon Batch使用该requests值来做出扩展决策。如果未指定requests值,则该limits值将复制到该requests值中。

以下是指定内存资源的限制:

  • 必须指定至少一个内存requestslimits值。

  • 内存值必须在mebibytes (MiBs) 中。

  • 如果两者都指定,则该requests值必须等于该limits值。

  • Amazon Batch使用该requests值来做出扩展决策。如果未指定requests值,则将该limits值复制到该requests值中。

以下是指定 GPU 资源的限制:

  • 如果两者都指定,则该requests值必须等于该limits值。

  • Amazon Batch使用该requests值来做出扩展决策。如果未指定requests值,则该limits值将复制到该requests值中。

示例作业定义

AmazAmazon Batch on EKS 任务定义中的以下内容配置了软 vCPU 共享。这允许 AmazAmazon Batch on 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" } } } ] } } }

以下是 AmazAmazon Batch on EKS 任务定义的request1值为,为该任务分配的最大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" } } } ] } } }

AmazAmazon Batch on EKS 任务定义中的以下内容将 vCPUlimits 值设置为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" } } } ] } } }

将 Amazon EKSAmazon Batch 上的任务Amazon Batch转换为 Amazon EKS Pod 时,将limits值Amazon Batch复制到该requests值中。这是在未指定requests值时。当您提交前面的示例任务定义时,pspec od 如下所示。

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 和内存预留

Amazon Batch依赖于bootstrap.sh文件的 vCPU 和内存预留的默认逻辑。有关bootstrap.sh文件的更多信息,请参阅 bootstrap.sh。在调整 vCPU 和内存资源的大小时,请考虑以下示例。

注意

如果没有实例在运行,vCPU 和内存预留最初可能会影响Amazon Batch扩展逻辑和决策。实例运行后,Amazon Batch调整初始分配。

节点 CPU 预留示例

CPU 预留值是使用实例可用的 vCPUs 总数以毫核为单位计算的。

vCPU 编号 保留百分比
1 6
2 11
3-4 0.5%
4 0.25

使用上述值,以下各项适用:

  • 具有 2 个 vCPUs 的c5.large实例的 CPU 预留值为 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。

在此示例中,有 1930 个(计算为 2000-70 年)百万个 vCPU 单位可用于在c5.large实例上运行作业。假设您的任务需要2 (2*1000 m) 个 vCPU 单元,则该任务不适用于单个c5.large实例。但是,需要1.75 vCPU 单元的工作很合适。

节点内存预留示例

内存预留值是使用以下公式以兆字节为单位计算的:

  • 实例容量。例如,一个 8 GB 的实例是 7,748MiB。

  • kubeReserved价值。该kubeReserved值是为系统守护程序保留的内存量。该kubeReserved值按以下方式计算:(11 * 实例类型支持的最大 pod 数)+ 255)。有关实例类型支持的最大 pod 数量的信息,请参阅 eni-max-pods.txt

  • HardEvictionLimit价值。当可用内存低于该HardEvictionLimit值时,实例会尝试驱逐 pod。

计算可分配内存的公式如下:(instance_capacity_in_MIB)-(11 * (maximum_number_of_pods))-255-(HardEvictionLimit值。 ))。

一个c5.large实例最多支持 29 个 pod。对于HardEvictionLimit值为 100 MiB 的 8 GBc5.large 实例,可分配的内存为 7074MiB。这是通过以下方式计算的:(7748-(11 * 29) -255 -100) = 7074 MiB。在此示例中,8,192 个MiB作业不适合此实例,即使它是 8gibibyte (GiB) 实例。

DaemonSets

在使用时DaemonSets,请注意以下几点:

  • 如果 Amazon EKS 实例Amazon Batch上没有在运行,则最初DaemonSets可能会影响Amazon Batch扩展逻辑和决策。 Amazon Batch最初分配 0.5 个 vCPU 单元,为预期分配 500 MiBDaemonSets。实例运行后,Amazon Batch调整初始分配。

  • 如果 aDaemonSet 定义了 vCPU 或内存限制,则Amazon Batch在 Amazon EKS 上,任务的资源会减少。我们建议您尽可能减少分配给Amazon Batch任务的DaemonSets数量。