AWS ECS部署:内存不足

9

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

  • 服务类型:REPLICA
  • 任务数量:3
  • 最小健康百分比:30
  • 最大百分比:100
  • 放置模板:AZ 平衡传播
  • 服务自动扩展:否。

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

  • 网络模式:awsvpc
  • 任务内存:--
  • 任务 CPU:--

在容器级别上,我仅配置了 Memory Soft Limit 如下:

  • 软限制: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重新部署代码(使用force deploy)时,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个回答

7

在部署期间,ECS调度器将基于每个容器的软限制分配内存。

2048 * 3 = 6144 MB 

这比实例中可用的内存少。

5632 (available memory) < 6144 (required memory)

如果在同一ECS容器实例中运行副本,则建议保持最小软限制,其应小于或等于1GB,这也是由ECS建议的。
因此,使用此配置,您将运行蓝绿部署,保持软限制最小的好处是,当需要时,容器可以扩展以使用更多内存,因此分配一些大内存作为软限制不会影响性能。
我不建议将最小健康百分比:0降低,因为将软限制降至1GB将解决问题
或者,如果要保持相同的内存限制,则减少最小健康百分比

感谢您的回复,@Adiii。我尝试了512 MB的软限制,但仍然遇到了同样的问题。最后,我删除并重新创建了服务和实例,现在一切都正常了。不确定第一种情况缺少了什么。只想澄清一下:我有3个实例(总内存为22.5 GB)。当ECS调度任务(软限制为2 GB和AZ平衡分布)时,它不应该查看每个EC2实例并确定是否有足够的内存吗?您提到的内容适用于所有3个容器放置在同一个实例中的情况,但在这里,我将其分散在3个实例中。 - gsa
调度程序将在所有实例上进行分配,如果它们具有内存容量。因此,在部署之前,请确保软内存限制未达到最大实例内存容量。您可以使用内存预留下的集群指标轻松检查这一点。 - Adiii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接