

# 排查 Amazon ECS 任务定义 CPU 或内存无效错误
<a name="task-cpu-memory-error"></a>

使用 Amazon ECS API 或 AWS CLI 注册任务定义时，或者如果指定了无效的 `cpu` 或 `memory`，则返回以下错误。

```
An error occurred (ClientException) when calling the RegisterTaskDefinition operation: Invalid 'cpu' setting for task. 
```

**注意**  
使用 Terraform 时，可能会返回以下错误。  

```
Error: ClientException: No Fargate configuration exists for given values.
```

要解决此问题，您必须在任务定义中为任务 CPU 和内存指定受支持的值。在任务定义中，`cpu` 值可以用 CPU 单元数或 vCPU 数表示。注册任务定义时，其将转换为指示 CPU 单元的整数。在任务定义中，`memory` 值可以用 MiB 或 GB 表示。注册任务定义时，它会转换为表示 MiB 的整数。

对于为 `requiresCompatibilities` 参数指定的 `FARGATE` 任务定义（即使也指定了 `EC2`），必须使用下表中的一个值。这些值决定了 CPU 和内存参数支持的值范围。

对于 Fargate 上托管的任务，下表显示了有效的 CPU 和内存组合。JSON 文件中的内存值以 MiB 为单位指定。您可以通过将 GB 值乘以 1024 来其转换为 MiB。例如 1 GB = 1024 MiB。


|  CPU 值  |  内存值  |  AWS Fargate 支持的操作系统  | 
| --- | --- | --- | 
|  256 (.25 vCPU)  |  512MiB、1GB、2GB  |  Linux  | 
|  512 (.5 vCPU)  |  1GB、2GB、3GB、4GB  |  Linux  | 
|  1024 (1 vCPU)  |  2GB、3GB、4GB、5GB、6GB、7GB、8GB  |  Linux、Windows  | 
|  2048 (2 vCPU)  |  4 GB 到 16 GB 之间（以 1 GB 为增量）  |  Linux、Windows  | 
|  4096 (4 vCPU)  |  8 GB 到 30 GB 之间（以 1 GB 为增量）  |  Linux、Windows  | 
|  8192 (8 vCPU)  此选项需要 Linux 平台 `1.4.0` 或更高版本。   |  16 GB 到 60 GB 之间（以 4 GB 为增量）  |  Linux  | 
|  16384 (16vCPU)  此选项需要 Linux 平台 `1.4.0` 或更高版本。   |  32 GB 到 120 GB 之间（以 8 GB 为增量）  |  Linux  | 

对于 Amazon EC2 上托管的任务，受支持的任务 CPU 值介于 0.25 个 vCPU 与 192 个 vCPU 之间。

EC2 和 Fargate 使用不同的 CPU 控制机制：
+ 在 Amazon EC2 上托管的任务：Amazon ECS 使用 CPU 周期和 CPU 配额来控制任务大小 CPU 硬限制。当您在任务定义中指定 vCPU 时，Amazon ECS 会将该值转换为适用于 `cgroup` 的 CPU 周期和 CPU 配额设置。
+ 对于在 Fargate 上托管的任务：Amazon ECS 使用 CPU 份额来控制 CPU 分配。Fargate 任务不使用 CPU 配额和周期值来限制 CPU。

对于 Amazon EC2 任务，CPU 配额用于控制在给定 CPU 周期内授予 `cgroup` 的 CPU 时间。这两个设置均以微秒为单位表示。当 CPU 配额等于 CPU 周期时，意味着 `cgroup` 可以在一个 vCPU 上执行高达 100%（或在多个 vCPU 上执行任意比例，总计为 100%）。CPU 配额的最大值为 1000000us，CPU 周期最小为 1 ms。您可以使用这些值来设置 CPU 数量的限制。当您在不更改 CPU 配额的情况下更改 CPU 周期时，您的有效限制与您在任务定义中指定的限制不同。

100 ms 周期允许 vCPU 的范围为 0.125 到 10。

**注意**  
Windows 容器将忽略任务级 CPU 和内存参数。