如何减less.NET Core docker容器的内存使用量?

我们在托pipeWeb API的Docker / Ubuntu上运行.NET Core 1.1容器。 这些容器基于microsoft/aspnetcore:1.1.2 ,为Ubuntu x64平台发布了二进制文件,并在构build映像时复制到其中,并且非常简单。

目前我们的Web API也非常简单,最多只有less数控制器从SQL Server中提取数据。 他们没有重大的caching或任何不寻常的,但是当运行使用500-900 Mb的RAM每个地方。 这不是由于内存泄漏造成的 – 每个容器的内存使用量随时间变化都是稳定的,在使用过程中上下变化10-15Mb。

这个级别的RAM使用应该是完全没有必要的 – 我怎样才能减less它?

我已经回顾了Docker容器的内存使用问题,但它不同,在这一点上没有答案。

我已经尝试了一些方法来解决这个问题,并且从.NET Core团队得到了一个响应,所以我会在这里logging下来,以防其他人使用。

1)我已经有一些成功的指定使用标志的Docker容器命令行的内存限制,例如。 --memory="200m" --memory-swap="500m" ; 这可以用来控制内存使用情况,并防止服务器意外运行内存不足,但我所看到的是容器所需的内存不会显着减less,它只是被迫交换,这降低了性能API。 我没有尝试--memory="200m" --memory-swap="200m" (即不允许交换) – 我会这样做,当我有机会,我怀疑API会抛出内存exception,或严重退化。

2)使用.NET 1.1(如果需要限制内存)的最佳解决scheme似乎是通过在.csproj文件PropertyGroup部分中放置<ServerGarbageCollection>false</ServerGarbageCollection>将GC切换到工作站模式。 在我的情况下,这将内存使用量降低到每个容器80-100mb。 服务器垃圾收集的目的是处理内存清理在大规模并发期间,所以这可能不是一个好的解决scheme,如果你正在build立的API或网站的经验,但我们的API有less量的并发用户,所以它似乎工作好。

从长远来看 ,我在CoreCLR团队获得了@janvorli的有益回应。 很显然,这个问题是由.NET Core GC中的一个错误引起的,它将在即将发布的2.0.2版本中得到修复。 你可以在Github的repo (search“ettery”) 上阅读这个问题的细节。