Como desabilitar o GC do servidor no ASP.NET Framework App em execução no Serviço de Aplicativo do Azure

8

Estou fazendo uma hospedagem de alta densidade de aplicativos ASP.NET MVC 5 / WCF no Serviço de Aplicativo do Azure e os aplicativos inativos estão usando 600 ~ 1000MB de memória cada, o que é bastante, já que um despejo de memória revela que o heap do GC é apenas cerca de ~ 40MB completo. Eu suspeito que isso se deve ao servidor GC, então tentei desabilitá-lo seguindo https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcserver-element e adicionando

<gcServer enabled="false" />

ao meu web.config, mas isso não parece ter nenhum efeito como

GCSettings.IsServerGC

ainda está retornando verdadeiro. O que estou perdendo aqui?

EDITAR:

Usando o IIS normal, isso pode ser feito usando https://weblogs.asp.net/owscott/setting-an-aspnet-config-file-per-application-pool, mas no Serviço de Aplicativo do Azure, você não tem permissão para fazer isso.

Suchiman
fonte
1
Qual é o problema que você acha que tem? Aplicativos usando muita memória? Parece-me que você acha que tem um problema, mas não tem.
Neil
@ Neil, como expliquei, os aplicativos estão usando até 1 GB de memória, sem fazer nada e, como analisei, o heap do GC possui apenas cerca de 40 MB de utilização. Sabe-se que o GC do servidor possui uma maior capacidade de memória do que o GC da estação de trabalho, portanto, ter uma utilização mais eficiente da memória é mais importante do que os benefícios do server gc para mim nesse caso.
Suchiman 28/02
Se eles realmente não o usam, enquanto o reivindicam, não está realmente lá. O que significa que você caça fantasmas (reserva, não uso).
TomTom
@ TomTom, quero dizer, ele ainda consome recursos físicos no meu Plano de Serviço de Aplicativo, que tem aproximadamente 80% de utilização de memória. Apenas não é usado efetivamente.
Suchiman
1
parece que essa configuração não funciona mais para o ASP.NET. Eu tentei e nem funciona no meu ambiente local. Porém, funciona bem para o ASP.NET Core.
Tom Luo

Respostas:

0

Ok, primeiro de tudo, parece que você pode precisar depurar manualmente o uso da memória dos componentes usando GC.Collect (): https://docs.microsoft.com/en-us/dotnet/api/system.gc.collect ? view = netcore-3.1

Dessa forma, você poderá identificar uma parte específica do código que causa um vazamento de memória devido a uma coleta de lixo incorreta ou partes que estão usando determinadas bibliotecas de terceiros.

Depois de concluir esta parte tediosa, dependendo do que você acha que está causando o problema, considere usar um descarte manual do bloco de código utilizando (using var item = new NameOfClass()) ou mesmo tentar implementar IDisposeas classes que o causam: https: / /docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose .

Stefanos
fonte