Cómo deshabilitar Server GC en la aplicación ASP.NET Framework que se ejecuta en Azure App Service

8

Estoy haciendo un hosting de alta densidad de aplicaciones ASP.NET MVC 5 / WCF en Azure App Service y las aplicaciones inactivas están usando 600 ~ 1000MB de memoria cada una, lo que es bastante, dado que un volcado de memoria revela que el montón GC es solo alrededor de ~ 40MB completos. Sospecho que esto se debe al servidor GC, así que intenté deshabilitarlo siguiendo https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcserver-element y agregando

<gcServer enabled="false" />

a mi web.config, pero esto no parece tener ningún efecto como

GCSettings.IsServerGC

sigue volviendo cierto. que me estoy perdiendo aqui?

EDITAR:

El uso de IIS normal se puede hacer usando https://weblogs.asp.net/owscott/setting-an-aspnet-config-file-per-application-pool pero en Azure App Service, carece de los permisos para hacerlo.

Suchiman
fuente
1
¿Cuál es el problema que crees que tienes? ¿Aplicaciones que usan demasiada memoria? Me parece que piensas que tienes un problema pero no lo tienes.
Neil
@Neil, como he explicado, las aplicaciones están utilizando hasta 1 GB de memoria, sin hacer nada y, como he analizado, el montón de GC solo tiene unos 40 MB de utilización. Se sabe que el servidor GC tiene una mayor huella de memoria que el GC de la estación de trabajo, por lo que tener una utilización de memoria más eficiente es más importante que los beneficios del servidor gc para mí en este caso.
Suchiman
Si realmente no lo usan, mientras lo reclaman, no está realmente allí. Lo que significa que cazas fantasmas (reserva no uso).
TomTom
@TomTom, quiero decir, todavía ocupa recursos físicos en mi Plan de Servicio de Aplicaciones, que tiene una utilización de memoria del 80%. Simplemente no se usa de manera efectiva.
Suchiman
1
parece que esta configuración ya no funciona para ASP.NET. Lo he intentado y ni siquiera funciona en mi entorno local. Sin embargo, funciona bien para ASP.NET Core.
Tom Luo

Respuestas:

0

Ok, en primer lugar, parece que podría tener que depurar manualmente el uso de memoria de los componentes usando GC.Collect (): https://docs.microsoft.com/en-us/dotnet/api/system.gc.collect ? view = netcore-3.1

De esta manera, es posible que pueda identificar una parte específica del código que causa una pérdida de memoria debido a una mala recolección de elementos no utilizados o partes que utilizan ciertas bibliotecas de terceros.

Una vez que haya terminado con esta parte bastante tediosa, dependiendo de lo que piense que está causando el problema, debería considerar usar una eliminación manual del bloque de código utilizando (using var item = new NameOfClass()) o incluso intentar implementarlo IDisposeen las clases que lo están causando: https: / /docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose .

Stefanos
fuente