Dotnet Core Docker Container Leaks RAM on Linux and causes OOM
This could be because garbage collection (GC) is not executed.
Looking at this open issue it looks very similar:
https://github.com/dotnet/runtime/issues/851
One solution that made Ubuntu 18.04.4
work on a virtualized machine was using Workstation garbage collection (GC):
<PropertyGroup>
<ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
https://github.com/dotnet/runtime/issues/851#issuecomment-644648315
https://github.com/dotnet/runtime/issues/851#issuecomment-438474207
https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/workstation-server-gc
This is another finding:
After further investigations I've noticed that there is big difference between my servers in amount of available logical CPUs count (80 vs 16). After some googling I came across this topic dotnet/runtime#622 that leads me to an experiments with CPU/GC/Threads settings.
I was using --cpus constraint in stack file; explicitly set System.GC.Concurrent=true, System.GC.HeapCount=8, System.GC.NoAffinitize=true, System.Threading.ThreadPool.MaxThreads=16 in
runtimeconfig.template.json
file; update image to a 3.1.301-bionic sdk and 3.1.5-bionic asp.net runtime — I made all this things in a various combinations and all of this had no effect. Application just hangs until gets OOMKilled.The only thing that make it work with Server GC is
--cpuset-cpus
constraint. Of course, explicit setting of available processors is not an option for a docker swarm mode. But I was experimenting with available cpus to find any regularity. And here I got a few interesting facts.What is interesting, previously I have mirgated 3 other backend services to a new servers cluster and they all go well with a default settings. Their memory limit is set to
600 Mb
but in fact they need about400 Mb
to run. Things go wrong only with memory-consuming applications (I have two of those), it requires3 Gb
to build in-memory structures and runs with a6 Gb
constraint.It keeps working in any range between
[1, 35]
available cpus and gets hanging when cpus count is36
.
https://github.com/dotnet/runtime/issues/851#issuecomment-645237830