使用Fargate的ECS上的memoryReservation实际上是做什么的?

时间:2019-06-27 16:26:26

标签: amazon-ecs aws-fargate

ECS的容器定义允许您为每个容器指定memoryReservation

  

为容器保留的内存软限制(以MiB为单位)。当系统内存处于争用状态时, Docker尝试将容器内存保持在此软限制内;但是,您的容器可以在需要时消耗更多的内存,最多可以使用memory参数指定的硬限制(如果适用),或者容器实例上的所有可用内存(以先到者为准)。此参数映射到Docker Remote API的``创建容器''部分中的MemoryReservation,并且映射到docker run的--memory-reservation选项... 如果您指定memoryReservation,则将从可用内存资源中减去该值放置容器的容器实例;否则,将使用内存值。例如,如果您的容器通常使用128 MiB的内存,但偶尔在短时间内突发到256 MiB的内存,则可以将memoryReservation设置为128 MiB,并将内存硬限制设置为300 MiB。此配置将允许容器仅从容器实例上的剩余资源中保留128 MiB的内存,而且还允许容器在需要时消耗更多的内存资源。

我相信这是使用cgroup的“ soft limits”实现的。

因此,这意味着在ECS + EC2上,此选项的目的是允许您在实例上调度一组任务,如果这些任务一次全部使用了它们的最大内存,则将超过该实例上可用的总内存。实例,但是您预测他们不会那样做。

但是ECS + Fargate上呢? Fargate具有task size任务容器的组合硬限制(“ memory”选项)不能超过任务大小的内存。 [最后一部分是错误的;请参阅我的明确答案。]无论您设置的内存限制如何,您都是billed based on the task size。那么将memoryReservation设置在硬限制以下可能会带来什么好处?

我能想到的唯一可能性是:

  1. memoryReservation指示AWS将您的容器打包到较少数量的基础VM上,冒着性能问题的风险,这对您没有任何好处(因为价格相同)。
  2. AWS只会忽略memoryReservation的Fargate。

我错过了任何可能性吗?如果不是,亚马逊会说这是哪一个?

2 个答案:

答案 0 :(得分:0)

在一个任务中有多个容器的情况如何?您可能要为一个容器保留一些内存。另外,您可能会遇到以下情况:不同的容器同时需要大量内存,并且您不希望它们中的任何一个占用过多的内存并拖延其余的容器。

答案 1 :(得分:0)

我现在意识到我的问题中存在不正确的前提:

  

Fargate具有任务大小,并且任务容器的组合硬限制(“内存”选项)不能超过任务大小的内存。

实际上,组合的软限制(“ memoryReservation”选项)不能超过任务内存。合并的硬限制可以。因此,在Fargate上,您可以在单个任务中安排多个“突发”容器,并且单个容器在被杀死之前可以使用任务的整个可用内存。这有点类似于您可以使用单容器任务和memoryReservation在EC2实例上实现的功能。

不过,您不需要使用memoryReservation在Fargate上完成它(您不能设置超出任务大小的任何内存限制或保留)。因此问题仍然存在,为什么要在Fargate上使用该设置?我认为最好的答案可能是MasterFowl提供的答案:提示内核不要让您的容器占用太多任务内存。