ASP NET Core und Docker Memory Probleme

Eine ASP NET Core Anwendung mit SignalR knüpft sich den RAM vor, wie man ein .NET Core Projekt optimal für Docker anpassen kann, erfährst du hier.

Tahsin Yurtseven, Februar 23, 2018

Ausgangspunkt

Ein regionales Mietwagenunternehmen möchte seinen Kunden eine direkte Buchung über www.oecher-wagen.de anbieten. Die Webseite wurde mit Django CMS entwickelt. Für die Buchungsfunktion haben wir uns für Angular entschieden, welche direkt mit einem Asp NET Core SignalR Hub kommuniziert. Um das Hosting dieser App so günstig wie möglich zu ermöglichen haben wir einen überschaubaren Preisvergleich erstellt:

  VPS Docker Azure
Wartungsaufwand Ja Nein Nein
Always On Ja Ja  Optional
Lizenzkosten Ja Nein Nein
CI/CD Nein Ja Ja
Preis ab 4,99 €  ab 5,00 € ab 8,00 €

Eine VPS müsste man vollständig konfigurieren und natürlich die anfallenden Fehler nacheinander beheben, Azure bietet zwar mit dem App Service (Plan) eine günstige Alternative an, leider sind die Ressourcen die man für den Preis bekommt sehr eingeschränkt. Die Entscheidung ist hier auf Docker gefallen, weil das Hosting mit Sloppy.io sehr einfach einzurichten und zudem preiswert ist. Skallierbarkeit bieten in dem Fall nur Docker und Azure an, weil es aber hierbei um ein kleines Projekt geht wurde das außenvor gelassen. Bei Sloppy bekommt man für den Preis dieselbe Leistung wie bei Azure.

Docker Upload / Metric Überwachung

Nach einem erfolgreichen Build des Dockerfiles wurde das Image auf DockerHub gepusht und von Sloppy gepullt. Damit lief der Container die ersten Stunden ohne Probleme und danach kam folgende Memoryusage heraus.

Asp net Core Docker Memory Leak

Das Problem liegt hier in der Einstellung für den GC, Garbage Collector. Je nach Serverhardware verhält sich der GC anders, und der maximal freigebene RAM wird immer überschritten und damit der Container neugestartet. Nach einer Recherche haben wir erfahren, dass für .NET Core Anwendungen innerhalb eines Containers der GC sich "besser" auf Workstation statt Serverebene beziehen soll. Das erreicht man mit folgender Ergänzung in der csproj Datei.

	OecherWagen.csproj
	<PropertyGroup> 
  <ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
ASP Net Core Memory Footprint

Der RAM Verbrauch ist ständig unter 30 MB und das mit einer SignalR Kommunikation. Während des Tests waren max. 10 Teilnehmer gleichzeitig im HUB angemeldet.