asp.net - consuming - Proceso de trabajo de IIS usando MUCHA memoria?
w3wp.exe windows server 2012 r2 (6)
Tengo un sitio web en mi servidor, y mi proceso de trabajo de IIS utiliza 4 GB de RAM de manera consistente. ¿Qué debería estar revisando?
c:/windows/system32/inetsrv/w3wp.exe
Como otras personas notaron que la causa común de este problema es la pérdida de recursos, también hay un problema conocido con el servidor win2k3 y IIS6 KB916984
Cree un mini-volcado del proceso w3wp y use WinDbg para ver qué objetos hay en la memoria. Esto es lo que hace el equipo de soporte de IIS en Microsoft cada vez que reciben preguntas como esta.
Más detalles definitivamente ayudaría. ¿Cuántas aplicaciones se están ejecutando dentro del grupo de aplicaciones? ¿Hay aplicaciones ASP.NET en el grupo?
Si está ejecutando ASP.NET, eche un vistazo a lo que está almacenando en la sesión y las variables de caché. Use PerfMon para verificar cuántas colecciones de Generación 0, 1 y 2 están ocurriendo. Tenga cuidado con el almacenamiento de los elementos de la IU en el estado o la memoria caché de la sesión, ya que esto evitará que se recopile toda la instancia de la página y todos los hijos de la instancia de la página. Finalmente, verifique si está haciendo una gran cantidad de concatenación de cadenas. Esto puede causar muchas instancias de objetos, ya que las cadenas .NET son inmutables. Considera usar StringBuilder en su lugar.
Si tiene acceso al código fuente, puede verificar que los objetos que implementan IDisposable estén referenciados dentro de las declaraciones o que se eliminen de manera adecuada cuando haya terminado con ellos.
Using
es una construcción de C #, pero la idea básica es liberar recursos cuando termines.
Otra cosa para verificar es que los objetos grandes se pongan en el estado o la memoria caché de la sesión "en proceso".
revise la sección sobre solución de problemas de cuellos de botella en Tuning .NET Application Performance
Verificaría la sección de afinación de CLR en el documento mencionado por Gulzar.
Como señalaron los otros carteles, cualquier objeto que implemente IDispose
debería tener Dispose()
invocado cuando haya terminado, preferiblemente utilizando el constructo using
.
Encienda perfmon.exe y agregue estos contadores:
- Proceso / Bytes privados
- .NET CLR Memory # Bytes en todos los montones
- Proceso / Conjunto de trabajo
- .NET CLR Memory / Large Object Heap size
Un aumento en bytes privados mientras que el número de bytes en todos los contadores de pilas permanece igual indica el consumo de memoria no administrada.
Un aumento en ambos contadores indica el consumo de memoria administrada