存在内存争用时,超出软内存限制的ECS容器会发生什么情况?

时间:2019-01-09 20:23:00

标签: docker amazon-ecs

说我有一个具有2G内存的实例,一个任务/容器的软内存限制为0.5G,硬内存限制为0.75G。

该实例正在运行3个容器,每个容器消耗0.6G内存。现在需要添加第四个容器吗?这三个正在运行的容器会发生什么?它们的内存分配减少了吗?还是将它们迁移到另一个实例?如果没有其他情况,将放置第四个容器怎么办?

我了解软,硬CPU限制的工作原理,因为CPU是动态资源(应用程序可以处理空闲CPU的峰值)。但是,如果使用内存,则无法真正从已经使用内存的容器中夺走内存。

2 个答案:

答案 0 :(得分:0)

第四个容器将无法生成,并且会出现以下错误。

(service sample) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 05016874-f518-4b7a-a817-eb32a4d387f1) has insufficient memory available. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide.

如果要计划第四个容器,则需要添加另一个ecs实例。所有其他3个容器将处于稳定状态。集群中没有发生减少内存分配的情况。如果没有实例,您的服务将始终处于不稳定状态,并继续为您提供上述错误。

参考:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

答案 1 :(得分:0)

实际上,可以从运行的进程中回收内存。例如,内核可能会驱逐文件支持的内存(例如进程本身的代码)。如果最终不再需要该数据,则内核可以将其分页回去。对此博客文章https://chrisdown.name/2018/01/02/in-defence-of-swap.html

进行了一些解释。

如果任务安排在该节点上,但是内核未能回收足够的内存以避免内存不足的情况,则其中一个进程将被内核杀死,docker将检测并杀死该容器,然后ECS将通知。我不确定ECS是否会尝试在同一实例或另一实例上重新安排已完成的任务。这可能取决于。