. net 6非托管内存似乎没有在运行在AWS EC2上的Docker容器中释放



我有一个worker应用程序,它将调用c++函数作为主要的工作任务,主要的计算能力和内存消耗预计在非托管代码中。worker有一个从Redis获取任务并执行的无限循环。虽然我已经按照在线说明在本机代码中释放本机内存,但当在AWS EC2上运行的内存限制为2GiB的docker容器和在具有32GB RAM的windows机器上执行时,我的代码的内存行为是完全不同的。

对于容器,我使用AWS CloudWatch进行监控。相同的负载多次发送,内存使用量似乎会不断增加,直到达到稳定状态,并且在没有作业运行时不会下降!!AWS容器的内存利用率

在windows机器上,内存使用要少得多,并且当没有更多的loadVisual studio诊断工具时,它将下降到接近初始状态的水平。

GC.GetTotalMemory(false)显示,在两个平台上,GC的总内存从未超过50MB。我理解这种比较可能不公平,不同的平台,不同的可用ram和内存类型我正在看似乎也不同(AWS CloudWatch似乎报告物理内存和VS诊断工具是给私有字节),我更好奇的是什么可能发生在linux容器?对我来说,它不太可能是本机代码中的内存泄漏,因为它永远保持稳定,而不是不断增长,直到达到OOM(我确实在生产中看到过一次OOM,这就是为什么我开始关注这个问题)。在我看来,更像是那些内存不会被释放,直到。net(或操作系统?)发现它必须这样做。

如果有人能给任何关于发生了什么以及为什么Linux容器和Windows之间的差异的见解,我将不胜感激!

我认为这是由于Docker在Linux中运行时报告内存的方式。

在Linux上,Kubernetes使用Docker运行我们的应用程序。Docker通过cgroup限制内存使用。c组内存限制(和使用情况)包括文件缓存。

查看Linux和Windows中如何报告内存的良好解释,https://www.gresearch.co.uk/blog/article/taking-out-the-garbage-fixing-a-garbage-collection-issue-for-docker-on-net/

最新更新