Amazon EKS 上 AWS Batch 的内存和 vCPU 注意事项 - AWS Batch

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

Amazon EKS 上 AWS Batch 的内存和 vCPU 注意事项

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

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

  • 至少必须指定一个 vCPUrequestslimits

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

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

  • 最小的有效 vCPU 值为 0.25。

  • 如果指定了两者的值,则 requests 值必须小于或等于 limits 值。这样,您就可以配置软和硬 vCPU 配置。

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

  • AWS Batch 使用 requests 值进行缩放决策。如果未指定 requests 值,则会将 limits 值复制到 requests 值中。

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

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

  • 内存值必须在 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 vCPU。内存限制为不超过 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 的 1 值为 request ,最多可为该作业分配 4 vCPU。

{ "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 作业上的 AWS Batch 转换为 Amazon EKS 容器组(pod)时,AWS Batch 会将 limits 值复制给 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 和内存预留

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

注意

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

示例:节点 CPU 预留

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

vCPU 数量 预留百分比
1 6%
2 1%
3-4 0.5%
4 及以上 0.25%

使用上述值,以下各项为真:

  • 具有 2 个 vCPU 的 c5.large 实例的 CPU 预留值为 70 m。计算方法如下:(1*60) + (1*10) = 70 m

  • 具有 96 个 vCPU 的 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 单元的作业合适。

示例:节点内存预留

内存预留值以 MB 为单位计算,使用以下公式:

  • 实例容量以 MB 为单位。例如,一个 8 GB 实例为 7,748 MiB。

  • 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 value.))。

一个 c5.large 实例最多支持 29 个容器组(pod)。对于 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 最初为预期 DaemonSets 分配了 0.5 个 vCPU 单元和 500 MiB。实例运行后,AWS Batch 调整初始分配。

  • 如果 DaemonSet 定义了 vCPU 或内存限制,那么在 Amazon EKS 作业上的 AWS Batch 的资源就会减少。我们建议您将分配给 AWS Batch 作业 DaemonSets 的数量保持在尽可能低的水平。