Web Farm Framework: WebAgentService.exe consume mucha memoria

Imaginemos este escenario, tenemos una Web Farm Framework 2.2 formada por:

· 2 Controllers: Windows 2008 R2

· 1 Primario: Windows 2008 R2

· Varios Secundarios: Windows 2008 R2

Poco a poco, el consumo de memoria en el WebFarmservice.exe está aumentando en los controllers y en algunos secundarios llegando hasta el punto de tener que reiniciar los servidores para solventarlo.

Para ver que ocurre, lo más fácil es revisar el comportamiento que estamos teniendo tal y como os conté en este post: https://blogs.msdn.com/b/desarrolloweb/archive/2012/05/06/asp-net-problemas-rendimiento.aspx

Pero en este caso veremos cómo el leak de memoria está en memoria nativa, por lo que necesitaríamos otro plan de acción

Día 1

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal

Free 193 7ff`c6796000 ( 7.999 Tb) 99.99%

.NET 144 0`1ac7a000 ( 428.477 Mb) 46.56% 0.01%

Heap 97 0`16921000 ( 361.129 Mb) 39.24% 0.00%

Image 763 0`069da000 ( 105.852 Mb) 11.50% 0.00%

Stack 80 0`01700000 ( 23.000 Mb) 2.50% 0.00%

Other 13 0`001b6000 ( 1.711 Mb) 0.19% 0.00%

TEB 23 0`0002e000 ( 184.000 kb) 0.02% 0.00%

PEB 1 0`00001000 ( 4.000 kb) 0.00% 0.00%

 

Día 5

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal

Free 200 7ff`91d80000 ( 7.998 Tb) 99.98%

Heap 189 0`4b031000 ( 1.172 Gb) 68.10% 0.01%

.NET 144 0`1ac7a000 ( 428.477 Mb) 24.31% 0.01%

Image 755 0`069da000 ( 105.852 Mb) 6.01% 0.00%

Stack 91 0`01a00000 ( 26.000 Mb) 1.48% 0.00%

Other 13 0`001b6000 ( 1.711 Mb) 0.10% 0.00%

TEB 26 0`00034000 ( 208.000 kb) 0.01% 0.00%

PEB 1 0`00001000 ( 4.000 kb) 0.00% 0.00%

 

Por lo que en este caso podemos usar LeakTrace para saber quién está haciendo las alocaciones de memoria por ejemplo usando DebugDiag

 

image

 

Examinando los volcados podremos ver quién no está liberando la memoria que usa. Si vemos un escenario parecido a este:

msvcrt!malloc+70  

nativerd!operator new+23  

nativerd!SCHEMA_ELEMENT::Clone+3f

nativerd!SCHEMA_ELEMENT::CreateElementObject+8d3

nativerd!SCHEMA_ELEMENT::CreateElementObject+973

nativerd!SCHEMA_ENTRY::CreateConfigElement+c9

nativerd!CONFIG_SECTION::ParseConfigSetting+29e

nativerd!SECTION_GROUP_TABLE::ParseConfigSetting+2fa

nativerd!CONFIG_FILE::ParseLocation+2ba

nativerd!CONFIG_FILE::ParseTopLevelElements+493

nativerd!CONFIG_FILE::ParseDom+d9

nativerd!CONFIG_FILE::ParseConfigFile+247

nativerd!CONFIG_CACHE::ParseConfigFile+3e

nativerd!CONFIG_CACHE::CacheMiss+a699      

nativerd!CONFIG_CACHE::ProcessConfigPath+4b25      

nativerd!CONFIG_CACHE::GetConfigFileList+40

nativerd!CONFIG_SYSTEM::GetConfigSectionInternal+1f2

nativerd!CONFIG_SYSTEM::GetAdminSection+b5 

mscorwks!DoCLRToCOMCall+177

 

En este artículo podemos ver como versiones anteriores de nativerd puede provocar un memory leak al no liberar memoria. Aunque describe otro escenario, el comportamiento que describe es el mismo: https://support.microsoft.com/kb/2618982

Instalando el hotfix debería solucionarse el problema.

 

Espero que os sirva de ayuda.

- José Ortega Gutiérrez