我们正在通过terraform在fargate上运行一个.NET应用程序,其中我们在aws_ecs_task_definition
资源中指定CPU和内存。
该服务只有1个任务,例如:
resource "aws_ecs_task_definition" "test" {
....
cpu = 256
memory = 512
....
根据文档,这是Fargate所必需的。
您也可以在container_definitions中指定cpu和memory,但文档指出该字段是可选的,并且由于我们已经在任务级别设置了值,因此我们没有在此处设置它们。
我们观察到,在任务启动后,我们的内存会增长,具体取决于应用程序,有时增长得非常快,有时则需要一段时间。
因此,我们开始认为我们有一个内存泄漏,并使用dotnet-monitor工具作为sidecar进行分析。
作为引入sidecar的一部分,我们在container_definitions级别为我们的.NET应用程序设置了cpu和memory值。
在我们完成这个操作之后,我们发现我们应用程序中的内存表现要好得多。
从.NET监视器跟踪中,我们看到当我们在container_definitions级别设置内存时:
- 工作集更小
- Gen 0/1/2 GC计数大于1(GC发生较早)
- GC 0/1/2大小较小
- GC已提交字节较小
因此,总结一下,当我们不在container_definitions级别设置内存时,内存会继续增长,并且直到我们几乎用完内存时才会发生GC。
当我们在container_definitions级别设置内存时,GC会定期发生,内存不会剧烈上升。
所以我们有了一个解决方案,但不理解为什么会这样。希望知道原因。