代码之家  ›  专栏  ›  技术社区  ›  maambmb

AWS ECS任务内存硬限制和软限制

  •  45
  • maambmb  · 技术社区  · 7 年前

    IIRC软限制是调度程序在实例上为要运行的任务保留的内存量,硬限制是容器在被杀死之前可以使用的内存量。

    我的问题是,如果ECS调度程序根据软限制将任务分配给实例,您可能会遇到这样的情况:使用高于软限制但低于硬限制的内存的任务可能会导致实例超过其最大内存(假设所有其他任务使用的内存略低于或等于其软限制)。

    这是正确的吗?

    2 回复  |  直到 7 年前
        1
  •  69
  •   nathanpeck    5 年前

    如果您希望运行的计算工作负载主要是内存限制而不是CPU限制,那么您应该只使用硬限制,而不是软限制。从文档中:

    必须在容器定义中为memory或memoryReservation中的一个或两个指定非零整数。如果同时指定两者,则内存必须大于memoryReservation。如果指定memoryReservation,则该值将从放置容器的容器实例的可用内存资源中减去;否则,将使用内存值。

    http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

    通过只为任务指定硬内存限制,可以避免内存耗尽,因为ECS停止在实例上放置任务,docker会杀死任何试图超过硬内存限制的容器。

    软内存限制功能是为CPU限制的应用程序设计的,在这些应用程序中,您希望保留少量的最小内存(软限制),但允许偶尔达到硬限制。在这种CPU繁重的工作负载中,您实际上并不太关心容器的内存使用量的具体值,因为容器在耗尽实例内存之前很长时间就会用完CPU,因此您可以根据CPU保留和软内存限制放置任务。在这种设置中,硬限制只是在出现失控或内存泄漏时的故障保护。

    因此,总而言之,您应该使用负载测试来评估您的工作负载,看看它是倾向于先用完CPU还是先用完内存。如果您是CPU受限的,那么您可以使用软内存限制和可选的硬限制,就像故障保护一样。如果你的内存有限,那么你只需要使用硬限制,没有软限制。

        2
  •  1
  •   pavelv    2 年前

    我的问题是,如果ECS调度程序将任务分配给实例 基于软限制,您可能会遇到以下情况: 导致实例超过其最大内存(假设所有其他任务 使用的内存略低于或等于其软限制)。

    This post AWS解释了在这种情况下会发生什么:

    如果没有硬限制,则在软限制和主机容量之间 记忆)杀手。ECS和Docker都不在这里;它是 Linux内核对内存压力作出反应。如果某物高于其 软限制,它比低于它的东西更有可能被杀死 了解系统上的所有其他进程以及它们在做什么 还有他们的记忆力。我们再次宣布了新的内存功能 可以将容器配置为在内存压力下交换到磁盘 脚本这可能会缓解对OOM杀手的需求 启动(如果容器配置为交换)。