繁体   English   中英

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

[英]How do I reduce memory usage for .NET Core docker containers?

我们在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容器内存使用问题,但它有所不同,此时没有答案。

我已经尝试了几种方法来解决这个问题,并得到了.NET Core团队的响应,因此我将在此处记录,以防它对其他人有用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM