参考资料
-
如何在 Amazon ECS 中为任务分配内存?
-
关于 Amazon ECS 中的 CPU 分配,我需要了解哪些信息?
-
Amazon ECS CloudWatch 指标
-
任务定义参数
在ecs中可以指定资源的分配逻辑,其实就是cpu和内存分配。
下面这张图对ecs任务和容器的内存资源分配和受限情况进行了总结
注意,下图并没有指出ecs代理和系统关键组件的预留内存
- overused,实例内存为300M,容器123分别预留100M,容器2实际使用30M,则容器3能够超额使用容器2的预留内存
- limit by contention,存在内存争用,因此容器2被限制在reserved
- limt by avail,容器2的实例使用被可用内存限制
- limit by hard,容器2的内存使用被硬限制卡住
- ample memory,容器2使用内存量介于软硬限制之间
ecs实例的内存管理
实例时容器运行的平台,ecs agent会计算实例上的可用资源数量。ecs实例的具体可用内存数量并不等于总的内存。例如,需要为ecs代理和关键系统进程留存内存,避免争用导致系统故障
通过为ecs代理配置以下变量可以为关键组件预留内存,这部分内存任务无法使用
ECS_RESERVED_MEMORY = 256
任务级别资源
Task size
创建任务定义时可以在任务和容器界别定义资源。任务级别资源定义是任务的硬限制
对于fargate平台,任务级别资源定义是必须的。对于ec2平台的ecs环境,任务级别的资源定义是可选的。如果指定了任务级别,则容器级别是可选的
windows平台不支持任务级别资源定义
The task size allows you to specify a fixed size for your task. Task size is required for tasks using the Fargate launch type and is optional for the EC2 or External launch type. Container level memory settings are optional when task size is set. Task size is not supported for Windows containers.
例如,如果指定了任务级别内存值,则容器级别内存值是可选的。在任务运行时,从 Amazon ECS 容器实例的可用内存单位中减去各个参数的值。根据软限制、硬限制或任务定义的任务级别内存进行计算
cpu的单位基准为unit或vcpu,每个vcpu为1024个unit。内存的单位基准为MB或GB
在任务级别设置 cpu 参数时,还将设置任务中容器允许的最大 CPU 资源量。cpu参数中设置的值将成为实例上任务的cpu资源预留。容器级别的cpu不能超过任务级别
容器级别资源
Container definitions
在容器级别对cpu资源定义(可压缩资源)
运行时没有cpu资源争用,则
- 任务级别的cpu指定时,容器有cpu资源上限
- 任务级别的cpu没有指定时,无论容器级别是否指定,容器都可用实例的所有cpu
- windows平台只支持容器级别,且容器级别为cpu资源上限
如果存在争用,则容器cpu限制为容器级别cpu值
此外,特殊应用程序(容器感知型)不会受到cpu争用的限制,只使用容器级别的限制
在容器级别可以对内存资源定义(不可压缩资源)
存在两个用于向任务分配内存的参数:memoryReservation(软限制)和 memory(硬限制)。
由于fargate在任务级别定义了资源,因此容器级别是可选的
如果为容器级别的 memory 和 memoryReservation 分别指定一个值,那么 memory 必须大于 memoryReservation。如果指定 memoryReservation,则将从容器所在容器实例的可用内存资源减去该值。没有 **memoryReservation **则使用 memory 的值
软限制和硬限制的区别
If you specify a hard limit (memory), your container will be killed if it attempts to exceed that limit. If you specify a soft limit (memoryReservation), ECS reserves that amount of memory for your container; however, the container can request up to the hard limit (if specified) or all of the available memory on the container instance, whichever is reached first. If you specify both, the hard limit must be greater than the soft limit.
如果容器超出内存硬限制,则会被oomkill。如果指定内存软限制,则会从实例的可用资源中隔离这部分。容器只会在硬限制和实例的可用资源中获取资源。
memoryreservation(软限制)是系统处于内存资源紧张时,容器能够使用的内存(专门为容器预留出的不会被其他容器争用)
硬限制必须大于等于软限制
任务中所有容器的内存总量必须小于任务的内容值