我已经配置了一个具有3个实例(m5.large)的AWS ECS集群,每个可用区(A,B和C)中都有一个实例。该服务的配置如下:
在“任务定义”中,我使用了以下内容:
在容器级别,我仅配置了“内存软限制”:
我已使用awslogs进行日志记录。上面的配置有效,当我启动服务时,每个实例中都运行着一个docker。其中一个实例的“ docker stats”显示以下内容:
MEM USAGE / LIMIT
230MiB / 7.501GiB
容器实例(ECS控制台)显示以下内容:
Resources Registered Available
CPU 2048 2048
Memory 7680 5632
Ports 5 ports
以上结果在所有3个实例中都是相同的-保留了2 GB内存(软限制),内存上限是接近8 GB的实例内存(未设置硬限制)。到目前为止,一切都按预期进行。
但是当我从Jenkins重新部署代码(使用强制部署)时,在Jenkins日志中出现以下错误:
"message": "(service App-V1-Service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 90d4ba21-4b19-4e31-c42d-d7223b34f17b) has insufficient memory available. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide.
在Jenkins中,作业显示为“成功”,但这是正在运行的旧版本代码。这三个实例上都有足够的可用内存。另外,我将最低健康百分比更改为30,希望ECS可以停止容器并重新运输新容器。任何进一步调试它的解决方案或指针都将有很大帮助。
答案 0 :(得分:2)
在部署期间,ECS调度将基于软限制为每个可以分配的容器分配内存
2048 * 3 = 6144 MB
小于实例中的可用内存
5632 (available memory) < 6144 (required memory)
如果您在同一ECS容器实例中运行副本,则我建议保持最小软限制,该限制应小于或等于1GB ,这也是ECS所建议的。
因此,使用此配置,您还将被运行 blue-green deployment 。由于将软限制保持在最低水平并没有什么害处,因为容器可以扩展以在需要时使用更多内存,因此为软限制应用一些大内存不会影响性能。
我不建议降低Minimum Healthy Percent: 0
,因为将软限制降低到 1GB可以解决此问题。
或者,如果要保持相同的内存限制,则减少Minimum Healthy Percent