
Tenemos IIS ejecutándose en dos servidores (IIS8 y 10) y últimamente encontramos un uso de memoria muy alto de nuestras aplicaciones de formularios web ASP.NET, a las que se accede principalmente a través de páginas aspx.
Lo que sucede es que con el tiempo, nuestros grupos de aplicaciones consumen cada vez más memoria, hasta que la memoria física del servidor (64 GB) está casi agotada. Definitivamente esto no es normal.
Intentamos descubrir por qué sucede esto, pero nos quedamos sin ideas. No está claro si se trata de una pérdida de memoria en nuestra aplicación o de un comportamiento normal, por lo que tal vez alguien pueda arrojar algo de luz al respecto.
Hechos:
Con el tiempo, los grupos de aplicaciones reservan Y usan cada vez más memoria, que no se libera (el administrador de tareas dice que tanto el conjunto de trabajo como el tamaño de confirmación son muy altos, por lo que en realidad se usa/retiene, ¿verdad?)
Los perfiladores de memoria como ANTS, .dotMemory, .NET MemoryProfiler dicen que el consumo de memoria administrada es bastante bajo, digamos 20-200 MB, y muestran mucha memoria no administrada, que se usaría, pero sería gratuita.
no dan ninguna pista de lo que podría estar causando el uso no administrado, incluso con instantáneas y métodos de creación de perfiles detallados.
Si "martillamos" la página de inicio con la tecla F5 sin soltarla, podemos disparar el uso de memoria hasta 2-5 gigabytes en un minuto. Esto es un poco loco.
Sabemos que IIS/grupos de aplicaciones tienden a reservar memoria de forma oportunista cuanta más memoria hay disponible, pero esto es demasiada.
lo único que vemos es que la página principal parece estar guardada en la memoria con sus controles y objetos ComponentModel, pero no hay ninguna referencia única a ninguno de nuestros objetos de página o clases de espacio de nombres propias en ningún lugar de los perfiladores de memoria.
El consumo de memoria fue anecdóticamente bueno hace un año y se detuvo en 2-3 gigabytes en total, pero ya no podemos reproducirlo con una versión anterior de la aplicación.
También sucede en una instalación local nueva de IIS en WIN10.
Las aplicaciones están integradas en modo de lanzamiento, optimizadas, compiladas en una única DLL por el momento, también probadas sin marca de seguimiento activada, 5 MB de tamaño.
Parece que necesitamos desarmar la aplicación, dividirla en varios módulos y ver cómo se comportan. Los ensamblados/bibliotecas cargados en tiempo de ejecución pueden ser el problema, pero no deberían serlo. En realidad, no hacemos mucha referencia (FreeTextBox, Microsoft ReportViewer, SharpCompress, Crystal Reports, AjaxControlToolKit 15), ya eliminamos todos menos CrystalReports/AjaxControlToolKit para ver qué sucede, pero no cambiamos.
También utilizamos muchos controles de WebForms, incluidos temporizadores y paneles de actualización a veces.
Tampoco sabemos cómo encontrar al culpable usando perfiles de memoria, asumiendo que hay una referencia oculta que hace que una o más páginas aspx se mantengan en la memoria porque las instancias de la clase .NET nunca muestran ningún vínculo a nada.
Estaremos encantados de recibir CUALQUIER pista de lo que podríamos malinterpretar con respecto a la reserva de memoria o cómo solucionar este problema de consumo de memoria.
¡Muchas gracias por tu tiempo!
EDITAR (olvidé mencionar): - Agregamos GC.Collect/WaitForPendingFinalizers/GC.Collect a nuestra función Page_Load de la página de inicio para ver si ayuda, y de hecho ayuda por un tiempo o un poco, hasta que haya otra presión. situación (con F5) en la que el uso de memoria vuelve a aumentar de forma extrema.
Respuesta1
Cuando GC.WaitForPendingFinalizers ayuda, podría ser una señal de memoria utilizada por los subprocesos. Si inicia un nuevo hilo separado en page_load, podría usar mucha memoria. Comience a diagnosticar el problema verificando el recuento de subprocesos en el administrador de tareas.