AWS ECS部署:内存不足

时间:2020-07-22 11:16:40

标签: amazon-web-services docker amazon-ecs

我已经配置了一个具有3个实例(m5.large)的AWS ECS集群,每个可用区(A,B和C)中都有一个实例。该服务的配置如下:

  • 服务类型:REPLICA
  • 任务数:3
  • 最低健康百分比:30
  • 最大百分比:100
  • 展示位置模板:AZ平衡点差
  • 服务自动缩放:否

在“任务定义”中,我使用了以下内容:

  • 网络模式:awsvpc
  • 任务记忆:-
  • 任务CPU:-

在容器级别,我仅配置了“内存软限制”:

  • 软件限制:2048 MB
  • 硬限制:-

我已使用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可以停止容器并重新运输新容器。任何进一步调试它的解决方案或指针都将有很大帮助。

1 个答案:

答案 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