如何减少.NET Core Docker容器的内存使用量?

Pet*_*ter 6 memory ubuntu docker .net-core asp.net-core

我们在托管Web API的Docker / Ubuntu上运行.NET Core 1.1容器。容器基于microsoft/aspnetcore:1.1.2为Ubuntu x64平台发布的二进制文件,并在构建映像时将其复制到副本中,变得非常简单。

目前,我们的Web API也非常简单,最多只有少数几个控制器从SQL Server中提取数据。它们没有大量的缓存或任何异常的东西,但是在运行时,每个都使用500-900 Mb的RAM。这不是由于内存泄漏引起的-每个容器的内存使用情况随着时间的推移是稳定的,在使用过程中上下波动10-15Mb。

此级别的RAM使用应该完全没有必要-如何减少它?

我已经审查了Docker容器内存使用问题,但问题有所不同,目前还没有答案。

Pet*_*ter 7

我尝试了几种方法来解决此问题,.NET Core团队对此做出了回应,因此在此进行说明,以防对他人有用。

1)我已经成功地使用标志在Docker容器命令行上指定了内存限制。--memory="200m" --memory-swap="500m"; 这可以用来控制内存使用情况并防止服务器意外耗尽内存,但是我看到的是容器所需的内存没有显着减少,只是被迫进行交换,这降低了内存的性能。 API。我没有尝试过--memory="200m" --memory-swap="200m"(即不允许进行任何交换)-如果有机会,我会这样做,我怀疑API会抛出内存不足异常,或者严重降级。

2).NET 1.1的最佳解决方案(如果需要限制内存)似乎是通过放入<ServerGarbageCollection>false</ServerGarbageCollection>.csproj文件PropertyGroup部分将GC切换到工作站模式。就我而言,这将每个容器的内存使用量降低到80-100mb。Server Garbage Collection旨在处理大量并发期间的内存清理,因此,如果您正在构建遇到这种情况的API或网站,但是这可能不是一个好的解决方案,但是我们的API的并发用户数量很少,因此似乎可以正常工作好。

从长远来看,我从CoreCLR团队收到@janvorli的有用回复。显然,此问题是由.NET Core GC中的错误引起的,该错误将在即将发布的2.0.2版本中修复。您可以在Github存储库(搜索“ ettery”)阅读本期的详细信息 。