我想在 Amazon Elastic Container Service (Amazon ECS) 中为任务分配 CPU,但我不知道如何开始。
简短描述
当您在 Amazon ECS 中创建任务定义时,可以在任务级别和容器级别定义 CPU 资源限制。这些限制可能会影响您的 Amazon ECS 集群的整体性能。根据 Amazon ECS 行为和您的用例,调整任务级别和容器级别的 CPU 分配值。使用以下信息来确定满足您的工作负载和应用程序要求的 CPU 分配。
解决方法
Amazon ECS 使用称为 CPU 单元 CPU 资源的标准计量单位。例如,对于 Linux,1024 个 CPU 单元等于 1 个 vCPU,2048 个 CPU 单元等于 2 个 vCPU。在定义任务定义时,您可以使用 1 个 vCPU 来代替 1024。任务定义注册后,ECS 会将值转换为单元。
**注意:**对于 Windows 容器,任务级别 CPU 和内存参数将被忽略。对于 Windows 容器,最佳做法是指定容器级别资源。有关详细信息,请参阅任务大小。
任务级别 CPU 分配
您可以在 AWS Fargate 或 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行 Amazon ECS 任务。
对于 Linux 实例,您在任务级别设置的 cpu 参数还设置该容器中任务允许的最大 CPU 资源数。在此任务配置中运行的容器只能使用由任务大小定义的 cpu 容量。
AWS Fargate
对于 Linux 和 Windows,AWS Fargate 需要在任务级别使用 cpu 参数来为任务分配请求的资源。您可以从 AWS Fargate 可用的预定义任务大小中选择内存和 cpu。
Amazon EC2
**注意:**对于在 Amazon EC2 Linux 上运行的任务,cpu 参数是可选的。
如果您在 Linux 中定义 cpu 参数,该参数具有以下限制:
- 根据您在任务级别定义的 cpu 量,您的容器具有有限的访问权限。
- 您在任务 cpu 参数中定义的值将成为在容器实例上计划的任务的 CPU 预留值。
- 分配给容器的 cpu 单元使用 Linux CPU 份额来实现任务内的份额。Linux CPU 是一种确定 CPU 访问优先级的加权机制。
在以下示例中,cpu 参数在 Amazon EC2 上的定义如下:
- 一个为总计 2048 个 CPU 单元在 ECS 集群中注册为容器实例的 m5.large EC2 实例。
- 一个在任务级别定义中定义的具有 cpu: 1024 的任务正在此实例上运行。
- 当前实例 EC2 CPUUtilization为 68%。
在前面的示例中,配置在池中还剩余 1024 个 CPU 单元。
当前 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 所定义值以下的 cpu 资源。
- 如果未设置任务级别 cpu 定义,您的任务中的容器有权访问您的实例中可用的所有 CPU 资源。无论在容器级别设置的 cpu 定义如何,容器都可以访问这些资源。
- 如果您使用 Windows 且不支持任务级别的 cpu,容器的上限为容器级别 cpu 定义。
**注意:**在 Windows 容器实例上,CPU 配额作为绝对配额强制执行。有关更多信息,请参阅环境。
对于 Linux 容器实例,容器级别 cpu 定义直接映射到 CpuShares 参数。有关更多信息,请参阅 Docker 网站上的创建容器 API。
CPU 争用
当多个进程请求 cpu 时间时,会发生 CPU 争用。发生 CPU 争用时,您的容器将被限制为您在容器级别定义在 cpu 上定义的资源量。
**重要事项:**验证您在 ECS 上运行的应用程序能否识别容器。某些应用程序(如 Java 10)可以识别容器,仅使用容器级别 cpu 定义中定义的限制。这些应用程序使用容器级别定义,即使存在 CPU 争用。
相关信息
我如何在 Amazon ECS 中为任务分配内存?