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
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