asp.net-mvc iis out-of-memory recycle w3wp

asp.net mvc - ¿Por qué IIS no está limpiando los viejos procesos de trabajo(w3wp.exe) en el reciclaje de grupos que llevan al sitio web a la excepción de memoria?



asp.net-mvc out-of-memory (4)

Como está claro por su parte, publicar IIS para reciclar después de alcanzar un cierto límite es crear un nuevo grupo de aplicaciones.

Puede haber múltiples razones por las cuales los mayores no son despedidos.

Uno puede ser una pérdida de memoria, no deshacerse de recursos no administrados, puede buscar esto.

Para descubrir otro motivo, habilite "Orphanización de procesos" en IIS. Para descubrir el proceso culpable, puede usar " Process Explorer ".

También tiene una opción para establecer un ejecutable , esto se ejecutará cuando un proceso quede huérfano / abandonado.

La solución inmediata también puede ser establecer la acción en KillW3p después de un cierto límite de CPU.

<applicationPools> <add name="DefaultAppPool"> <cpu limit="80000" action="KillW3wp" resetInterval="00:02:00" /> </add> </applicationPools>

Tengo un sitio asp.net-mvc y recientemente recibo excepciones de falta de memoria en mi servidor web. Solo tengo 1 grupo de aplicaciones y recientemente establecimos IIS para reciclar después de que alcanza un cierto límite. Fui el otro día y vi ejecutar 4 procesos w3wp.exe (cada uno con ~ 1.8 GB de memoria en uso)

Supongo que durante el proceso de reciclaje, no está matando el proceso de trabajo anterior y, finalmente, tengo excepciones de memoria en mi sitio web porque la caja solo tiene 8 GB de memoria. Puedo agregar memoria a la caja pero me preocupa por qué estos viejos procesos no se están limpiando.

¿Hay alguna recomendación para descubrir por qué este proceso de reciclaje no está eliminando los viejos procesos de w3wp.exe y dejándolos en ejecución? ¿Alguna sugerencia acerca de entender la causa raíz o incluso soluciones alternativas para evitar este riesgo en el futuro?


El reciclado de grupos de aplicaciones generalmente cierra los procesos de trabajo anteriores, por lo que no creo que aciertes un error de IIS.

Tenga en cuenta que los procesos pueden durar más si se quedan huérfanos y, en función de la configuración, IIS debe dejarlos allí para que pueda solucionarlos.

https://www.iis.net/configreference/system.applicationhost/applicationpools/add/failure

Si no está muy familiarizado con la depuración de dichos procesos, le sugiero que abra un caso de soporte a través de http://support.microsoft.com y deje que Microsoft lo ayude.


Tuve un problema similar cuando estaba ejecutando cosas como FFMpeg.exe o alguna conversión de PDF con gráficos WPF, el proceso de IIS no se cierra y emitía errores de memoria no encontrada. El problema no es con IIS, sino con algunos bloqueos en el proceso que bloquean incluso después de bloquearse.

La solución es dividir su sitio web en dos sitios web separados, uno solo debe hacer el procesamiento de transacciones con la base de datos, que generalmente no tiene fallas. La lógica como la conversión de video / foto, conversión de PDF o cualquier otra lógica que pueda causar un bloqueo se debe mover a otro servicio web. Y use la llamada HTTP desde su sitio web internamente para procesarlos a través de servicios web.

Ahora, en este caso, todavía no hay forma de evitar el bloqueo del proceso de servicio web, así que decidí reciclar el trabajador del grupo de aplicaciones cada 100 solicitudes (elegí este número después de ver algunas solicitudes; en promedio, iría más allá de 1GB solo después alcanzando 200 solicitudes) y convertí el grupo de aplicaciones en Web Garden haciendo 4 procesos por grupo.

La ventaja de esta configuración es que puede mover su proceso de servicio web a otras máquinas fácilmente en el futuro, puede aumentar / disminuir el número de procesos por grupo. Y su sitio web principal, que simplemente está haciendo un proceso de transacción, se vuelve altamente receptivo ya que no se ve afectado por el proceso de reciclaje de los servicios web.


El principal sospechoso al que debes acudir son las clases que implementan IDisposable y cualquier uso de ellas que no llame a Dispose() . Tuve un problema similar, que ya he publicado como respuesta a esta pregunta .

La causa más probable es que no llame .Dispose() a las conexiones de la base de datos. La gente tiende a confundirse acerca de esto porque el grupo de conexiones integrado de .NET hace que parezca que no se deben eliminar las conexiones. Sin embargo, llamar .Dispose() al final de la solicitud (o cuando haya terminado de usar la conexión) es exactamente lo que debe hacer para evitar fugas de recursos. La agrupación de conexiones espera que esto suceda.

No creo que los procesos de 4 w3wp.exe sean una gran preocupación, es normal que IIS genere múltiples procesos. Pero está claro que su aplicación tiene filtraciones de recursos que deben abordarse. Comience mirando IDisposable como mencioné anteriormente. Si todavía tiene problemas, eche un vistazo a los elementos que tiene en el caché y trate de determinar si existe una estrategia de caché más eficiente que pueda usar. Si todo lo demás falla, perfile la aplicación para ver si puede ubicar el origen de la fuga de recursos. Lo más probable es que su aplicación deba implementar IDisposable algún lugar que no sea.