AWS Fargate 及其内存管理

AWS Fargate and its memory management

AWS 文档我可以看到 CPUMemory 属性在资源的 AWS::ECS::TaskDefinition for Fargate but not in the ContainerDefinition 中是必需的 if 使用 Fargate

这究竟是如何工作的?如果我没有在 ContainerDefinition 中指定它,它会使用任务可用的资源吗?如果任务中只有一个容器……定义这些值是否有意义?如果需要它们,对我来说似乎是多余和冗长的。

注册任务定义时,您可以指定总 cpu 和任务使用的内存。这与容器定义级别的 cpu 和内存值是分开的。

如果使用 Fargate 启动类型,则这些任务定义字段是必需的,并且支持 cpu 和内存的特定值。这将是 CPU/Memory 呈现给任务的硬性限制。例如,如果您的任务配置为使用 1 个 vCPU 和 2 GB 内存,那么此时内存限制为 2 GB。如果任务内存使用率在任何时候超过 2 GB,任务将终止并出现 OutOfMemory 错误。

任务大小:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size

您还可以在容器级别指定 cpu 和内存资源。这将是呈现给容器的资源量(一个任务可以有多个容器)。如果您的容器试图超过此处指定的资源,则容器将被终止。这些字段对于使用 Fargate 启动类型的任务是可选的,唯一的要求是任务中为所有容器保留的 cpu 和内存总量低于任务级别 cpu 和内存值,如果指定了一个。

在容器级别,Docker 守护程序为容器保留至少 4 MiB 的内存,因此您不应为容器指定少于 4 MiB 的内存。

标准容器定义参数:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#standard_container_definition_params

当容器在 TaskDefinition 中没有指定限制时,容器将使用任务的所有可用资源,这对于 Fargate 任务是必需的。

这意味着如果TaskDefinition中只有一个容器,则无需定义它们。尽管它们是多余的(如果等于任务本身的那些)甚至是有害的(如果它们低于给任务的数量),则可以指定它们。

如果多个容器属于同一任务,Fargate 将在所有容器之间平均分配资源。这可能是(也可能不是)想要的 behavior.A