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

时间:2017-09-05 06:37:52

标签: ubuntu docker memory asp.net-core .net-core

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

我们的Web API目前也非常简单,最多只有少数控制器从SQL Server中提取数据。它们没有重要的缓存或任何异常,但在运行时使用每个500-900 Mb的RAM。这不是由于内存泄漏 - 每个容器的内存使用量随着时间的推移而变得稳定,在使用期间上下变化10-15Mb。

这种级别的RAM使用应该是完全没必要的 - 我该如何减少它?

我已经审核了Docker container memory use个问题,但它有所不同,目前还没有答案。

1 个答案:

答案 0 :(得分:5)

我已经尝试了几种方法来解决这个问题,并得到了.NET Core团队的回复,所以我会在这里记录,以防它对其他人有用。

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

2).NET 1.1的最佳解决方案(如果您需要限制内存)似乎是将<ServerGarbageCollection>false</ServerGarbageCollection>放入.csproj文件PropertyGroup部分,以将GC切换到工作站模式。在我的情况下,这会将每个容器的内存使用量降低到80-100mb。服务器垃圾收集旨在处理大规模并发期间的内存清理,因此如果您构建API或具有此功能的站点,这可能不是一个好的解决方案,但我们的API具有少量并发用户,因此它似乎工作好。

长期,我从@janvorli那里得到了有关CoreCLR团队的有用回复。显然,这个问题是由.NET Core GC中的一个错误引起的,该错误将在即将发布的2.0.2版本中修复。你可以阅读详细信息   this issue on the Github repo(搜索“ettery”)。