关于 Amazon ECS 中的 CPU 分配,我需要了解哪些信息?

上次更新日期:2022 年 4 月 15 日

我正在寻求将CPU分配给 Amazon Elastic Container Service (Amazon ECS) 中任务的相关信息。

简短描述

创建任务定义时,可以定义 CPU 资源的限制。可以在任务级别和容器级别定义这些限制。

根据这些限制,您的 Amazon ECS 集群的整体性能会受到影响。根据 Amazon ECS 行为和使用案例,您必须在任务级别和容器级别调整 CPU 分配值。使用以下信息确定满足工作负载和应用程序要求的 CPU 分配。

解决方案

Amazon ECS 使用称为 CPU 单元的标准 CPU 资源衡量单位。1024 个 CPU 单元相当于 1 个 vCPU。

例如,2048 个 CPU 单元等于 2 个 vCPU。

注意:定义任务定义时,也可以使用 1 个 vCPU,而不是 1024。注册任务定义后,ECS 会将值转换为单元。

任务级别的 CPU 分配

Amazon ECS 任务可以在 AWS Fargate 或 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行。

在任务级别设置 cpu 参数时,还将设置任务中容器允许的最大 CPU 资源量。

AWS Fargate

AWS Fargate 需要任务级别上的 cpu 参数才能将请求的资源分配给任务。可以从可用于 AWS Fargate 的预定义任务大小中选择 memorycpu 参数。可以在 AWS Fargate 开发人员指南任务 CPU 和内存部分了解有关不同组合的更多信息

Amazon EC2

在 Amazon EC2 上运行任务时,cpu 参数是可选项。

如果定义了 cpu 参数,请考虑以下事项:

  • 根据定义的 cpu 量,您的容器将具备有限的访问权限。
  • cpu 参数中定义的数量将成为在容器实例上计划的任务的 CPU 预留。
    注意:容器级别的定义也是如此。

例如,Amazon EC2 上具有以下配置的已定义 cpu 参数将在其池中剩余 1024 个 CPU 单元:

  • 在 ECS 集群中注册为容器实例的 m5.large EC2 实例总共拥有 2048 个 CPU 单元。
  • 一个在任务级别定义 cpu: 1024 的任务正在实例上运行。
  • 当前的实例 EC2 CPUUtilization 为 68%。

当前的 CPUUtilization 不会影响容器实例中可用于任务计划的 CPU 单元数。即使实例超过其使用率的 50%,其池中仍有一半的单元可用于启动新任务。这是因为该参数仅充当 CPU 预留和限制,并不直接转化为 CPU 使用率本身。

在此示例中,如果只考虑 CPU,可能会出现以下几种结果:

  • 可以使用在任务级别或容器级别定义中定义的 cpu: 512 再计划两个任务。
  • 可以使用两个容器计划一个任务,每个容器中均在任务级别定义 cpu: 1024、在容器级别定义 cpu: 512
  • 如果没有定义 cpu,那么可以为选择的网络模式计划 ECS 支持的任意数量任务。您的 ECS 容器实例中可用于计划的 CPU 单元不受影响。

容器级别的 CPU 分配

在以下情况中,会考虑容器级别的 cpu 定义:

计划时间:

  • 如果未设置任务级别的 cpu 定义,则容器中定义的 CPU 单元总数将成为 CPU 预留。
  • cpu 容器级别定义中的 CPU 单元总数不能大于在任务级别分配中定义的 CPU 单元数。

运行时,没有 CPU 争用现象:

  • 如果设置了任务级别 cpu 定义,则容器有权访问的 cpu 资源不能超过任务级别 cpu 定义的值。
  • 如果未设置任务级别 cpu 定义,则无论在容器级别设置的 cpu 定义如何,任务中的容器都有权访问实例中所有可用的 CPU 资源。
  • 如果使用的是 Windows 任务,但任务级别的 cpu 不受支持,那么容器可访问的资源上限始终为容器级别的 cpu 定义。

当多个进程请求 cpu 时间时,就会发生 CPU 争用。发生 CPU 争用时,您的容器将限制为容器级别定义中涉及 cpu 的资源量。

重要提示:请务必确认在 ECS 上运行的应用程序是否为容器感知型。某些应用程序(如 Java 10)是容器感知型的,并且只使用容器级别 cpu 定义中定义的限制,而不管是否存在 CPU 争用。

容器级别 cpu 定义直接映射到创建容器远程 Docker API 的 CpuShares 参数。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?