如何减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”) 上阅读这个问题的细节。
- 在Azure中的Docker中,一个带有swagger的asp.net核心Web API不起作用
- Docker中用于.NET Core应用程序的appSettings.json?
- 无论使用ITicketStore还是IDistributedCache,重新启动服务器时,身份validationCookie都会停止工作
- 在dotnet SDK和Docker容器上
- .Net Core Clrdebugging器VSDBG在Windows Docker容器中连接到远程进程时暂停应用程序
- Docker for windows:Linux与Windows容器之间的通信
- 在.NET Core上使用MongoDB Docker
- 在Docker中运行.Net Core 2.0上的IdentityServer4 – 访问主机资源
- .NetCore PostAsync和GetAsync不适用于Docker