Deaktivieren von Server GC in ASP.NET Framework App, das auf Azure App Service ausgeführt wird

8

Ich mache ein Hosting von ASP.NET MVC 5 / WCF-Apps mit hoher Dichte auf Azure App Service, und die inaktiven Apps verwenden jeweils 600 bis 1000 MB Speicher, was ziemlich viel ist, da ein Speicherauszug anzeigt, dass es sich um den GC-Heap handelt nur ca. 40MB voll. Ich vermute, dass dies auf Server-GC zurückzuführen ist, daher habe ich versucht, es zu deaktivieren, indem ich https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcserver-element folgte und hinzufügte

<gcServer enabled="false" />

zu meiner web.config, aber dies scheint keine Auswirkung zu haben als

GCSettings.IsServerGC

kehrt immer noch wahr zurück. Was fehlt mir hier?

BEARBEITEN:

Mit normalem IIS kann dies unter https://weblogs.asp.net/owscott/setting-an-aspnet-config-file-per-application-pool erfolgen. In Azure App Service fehlen Ihnen jedoch die entsprechenden Berechtigungen.

Suchiman
quelle
1
Was ist das Problem, von dem du denkst, dass du es hast? Apps mit zu viel Speicher? Klingt für mich so, als ob Sie denken, Sie hätten ein Problem, aber Sie tun es nicht.
Neil
@Neil Wie ich bereits erklärt habe, verbrauchen die Apps bis zu 1 GB Speicher und tun nichts. Wie ich analysiert habe, hat der GC-Heap nur eine Auslastung von ca. 40 MB. Server GC hat bekanntermaßen einen höheren Speicherbedarf als Workstation GC. Daher ist eine effizientere Speichernutzung für mich in diesem Fall wichtiger als die Vorteile von Server GC.
Suchiman
Wenn sie es dann nicht wirklich benutzen, während sie es behaupten, ist es nicht wirklich da. Was bedeutet, dass Sie Geister jagen (Reservierung nicht Verwendung).
TomTom
@ TomTom Ich meine, es beansprucht immer noch physische Ressourcen in meinem App Service Plan, was einer Speicherauslastung von etwa 80% entspricht. Es wird einfach nicht effektiv genutzt.
Suchiman
1
Es scheint, dass diese Einstellung für ASP.NET nicht mehr funktioniert. Ich habe es versucht und es funktioniert nicht einmal in meiner lokalen Umgebung. Es funktioniert jedoch gut für ASP.NET Core.
Tom Luo

Antworten:

0

Zunächst scheint es so, als müssten Sie die Speichernutzung von Komponenten mithilfe von GC.Collect () manuell debuggen: https://docs.microsoft.com/en-us/dotnet/api/system.gc.collect view = netcore-3.1

Auf diese Weise können Sie möglicherweise einen bestimmten Teil des Codes lokalisieren, der entweder einen Speicherverlust aufgrund einer fehlerhaften Speicherbereinigung verursacht, oder Teile, die bestimmte Bibliotheken von Drittanbietern verwenden.

Sobald Sie mit diesem ziemlich langwierigen Teil fertig sind, sollten Sie je nachdem, was Ihrer Meinung nach das Problem verursacht, entweder eine manuelle Entsorgung des Codeblocks in Betracht ziehen (using var item = new NameOfClass()) oder sogar versuchen, IDisposedie Klassen zu implementieren , die ihn verursachen: https: / /docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose .

Stefanos
quelle