¿Qué debo hacer para asegurarme de que IIS no recicla mi aplicación?


83

Tengo una aplicación de servicio WCF alojada en IIS. En el inicio, va y obtiene un recurso realmente costoso (en términos de tiempo y CPU) para usar como caché local.

Desafortunadamente, IIS parece reciclar el proceso de forma bastante regular. Así que estoy tratando de cambiar la configuración en el grupo de aplicaciones para asegurarme de que IIS no recicla la aplicación. Hasta ahora, he cambiado lo siguiente:

  • Intervalo límite bajo CPU de 5 a 0.
  • Tiempo de espera inactivo bajo modelo de proceso de 20 a 0.
  • Intervalo de tiempo regular bajo reciclaje de 1740 a 0.

¿Será esto suficiente? Y tengo preguntas específicas sobre los artículos que cambié:

  1. ¿Qué significa específicamente la configuración del intervalo de límite en la CPU? ¿Significa que si se excede cierto uso de la CPU, el grupo de aplicaciones se reciclará?
  2. ¿Qué significa exactamente "reciclado"? ¿La aplicación está completamente desarmada y puesta en marcha nuevamente?
  3. ¿Cuál es la diferencia entre "Cierre del proceso de trabajo" y "Reciclaje del grupo de aplicaciones"? La documentación para el tiempo de inactividad bajo el modelo de proceso habla sobre el cierre del proceso de trabajo. Mientras que los documentos para el Intervalo de tiempo regular en Reciclaje hablan sobre el reciclaje del grupo de aplicaciones. No entiendo la diferencia entre los dos. Pensé que w3wp.exe es el proceso de trabajo que ejecuta el grupo de aplicaciones. ¿Alguien puede explicar la diferencia en la aplicación entre los dos?

La razón para tener las etiquetas IIS7 e IIS7.5 es porque la aplicación se ejecutará en ambas y esperamos que las respuestas sean las mismas entre las versiones.

Imagen de referencia: ingrese la descripción de la imagen aquí


¿Dónde obtuviste esa captura de pantalla de arriba con la configuración de IIS?
Andrew William Ross

Esa es la hoja de propiedades del grupo de aplicaciones avanzadas.
TristanK

Respuestas:


105

Reciclaje

Por lo general, el reciclaje es * donde IIS inicia un nuevo proceso como contenedor para su aplicación, y luego entrega el anterior a ShutdownTimeLimit para que se vaya por su propia voluntad antes de que se elimine.

* - por lo general: consulte la configuración DisallowOverlappingRotation / "Desactivar reciclaje superpuesto"

Es destructivo , ya que el proceso original y toda su información de estado se descartan. El uso del estado de sesión fuera de proceso (por ejemplo, Servidor de estado o una base de datos, o incluso una cookie si su estado es pequeño) puede permitirle solucionar esto.

Pero, por defecto, se superpone , lo que significa que la duración de una interrupción se minimiza porque el nuevo proceso se inicia y se conecta a la cola de solicitudes, antes de que se le diga al anterior "tiene [ShutdownTimeLimit] segundos para desaparecer. Por favor, cumpla".

Configuraciones

A su pregunta: todas las configuraciones en esa página controlan el reciclaje de alguna manera. El "apagado" podría describirse como "reciclaje proactivo", donde el proceso en sí mismo decide que es hora de irse y sale de manera ordenada.

El reciclaje reactivo es donde WAS detecta un problema y dispara el proceso (después de establecer un W3WP de reemplazo adecuado).

Ahora, aquí hay algunas cosas que pueden causar el reciclaje de una forma u otra:

  • un ISAPI que decide que no es saludable
  • cualquier módulo se bloquea
  • tiempo de inactividad
  • limitación de la CPU
  • ajustar las propiedades del grupo de aplicaciones
    • como su madre pudo haber gritado en un momento: "¡Deja de molestarlo , o nunca mejorará!"
  • Falla de "ping" * en realidad no hace ping por sí, porque usa una tubería con nombre - más "detección de vida"
  • todas las configuraciones en la captura de pantalla anterior

Qué hacer:

Generalmente:

  • Deshabilitar tiempos de espera inactivos . 20 minutos de inactividad = ¡boom! Nuevo proceso en la próxima solicitud entrante. Ponlo a cero.

  • Desactivar Intervalo de tiempo regular : el valor predeterminado de 29 horas ha sido descrito como "loco", "molesto" e "inteligente" por varias partes. En realidad, solo dos de ellos son ciertos.

  • Opcionalmente Encienda DisallowRotationOnConfigChange (arriba, Desactivar Reycling cambios de configuración ) si usted no puede dejar de jugar con él - esto le permite cambiar cualquier configuración de grupo de aplicación, sin que al instante de señalización para el trabajador procesos que hay que matar. Debe reciclar manualmente el grupo de aplicaciones para que la configuración surta efecto, lo que le permite preestablecer la configuración y luego usar una ventana de cambio para aplicarla a través de su proceso de reciclaje.

  • Como principio general, deje el ping activado . Esa es tu red de seguridad. He visto a personas apagarlo, y luego el sitio se cuelga indefinidamente a veces, lo que lleva al pánico ... así que si la configuración es demasiado agresiva para su aplicación aparentemente muy, muy lenta para responder, retroceda un poco y mira lo que obtienes, en lugar de apagarlo. (A menos que tenga configurado el volcado en modo de bloqueo automático para W3WP colgados a través de su propio proceso de monitoreo)

Eso es suficiente para que un proceso de buen comportamiento viva para siempre. Si muere, seguro, será reemplazado. Si se cuelga, ping que debe escoger y un nuevo uno debe comenzar dentro de 2 minutos (por defecto; peor de los casos debería ser Calc: hasta la frecuencia de ping + de ping tiempo de espera + límite de tiempo de inicio antes de peticiones de empezar a trabajar otra vez).

La limitación de CPU no suele ser interesante, porque de forma predeterminada está desactivada y, de todos modos, también está configurada para no hacer nada; si estuviera configurado para matar el proceso, seguro, eso sería un desencadenante de reciclaje. Déjalo apagado. Nota para IIS 8.x, la aceleración de la CPU también se convierte en una opción.

Un AppPool (IIS) no es un (.Net) AppDomain (pero puede contener uno / algunos)

Pero ... luego nos metemos en tierra .Net y en el reciclaje de AppDomain, que también puede causar una pérdida de estado. (Ver: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Versión corta, que hace que al tocar un archivo web.config en la carpeta de contenido (de nuevo con la cosecha!), O mediante la creación de una carpeta en la carpeta, o un archivo ASPX, o .. otras cosas ... y eso es acerca tan destructivo como el reciclaje de un grupo de aplicaciones, menos los costos de inicio del código nativo (es puramente un concepto de código administrado (.Net), por lo que aquí solo sucede el código administrado).

El antivirus también puede activar esto ya que escanea archivos web.config, provocando una notificación de cambio, causando ...


2
Espera, espera, espera ... ¿por qué LEER un web.config de Antivirus desencadenaría una notificación de cambio? Cualquier antivirus que "toque" un web.config sin ninguna razón es basura.
Shiv

AV puede no solo leer, sino también escribir, por ejemplo, en una secuencia de datos alternativa, registrando la última versión del motor utilizada para escanear un archivo. Como un pensamiento.
TristanK

7

Cheque bondadoso,

¿Por qué reciclamos nuestros grupos de aplicaciones?

Si navega por la web para encontrar la razón por la cual los grupos de aplicaciones están configurados para reciclarse automáticamente periódicamente, tendrá dificultades para encontrar una respuesta razonable que no se relacione con problemas de memoria. Es como si la comunidad en general hubiera aceptado el hecho de que nuestras aplicaciones web (o capas de servicio alojadas en IIS) deberán reciclarse para evitar problemas de memoria.

Siempre he opinado que si su código requiere reinicios periódicos para seguir funcionando correctamente, entonces algo está claramente mal. Hay un error en su código en alguna parte y necesita corregirlo, en lugar de reiniciar el proceso ocasionalmente para que el problema 'desaparezca'.

Realmente necesito comenzar a centrarme más en la administración de memoria en .NET y en asegurarnos de que nuestras aplicaciones puedan seguir funcionando sin problemas.


3
Una razón fue que .NET usa un montón separado para 'objetos grandes' (usualmente 85K o más o algo así) que no se compacta cuando ocurre la recolección de basura (aunque en .NET 4.5.1 creo que agregaron la opción para compactar el LOH), y en ASP.NET cuando se procesa HTML en el lado del servidor, no es raro ver 85K de HTML (especialmente para contenido repetido como tablas y cuadrículas) y este HTML es básicamente en un punto solo un gran objeto String en el servidor, y si califica como un objeto grande, contribuye a la fragmentación del montón de objetos grandes, lo que finalmente resulta en OutOfMemoryException, por lo tanto, reciclado
necesario el

0

Basado en el escenario OP (inicialización larga en el inicio / calentamiento), otra cosa a verificar es el límite de tiempo de inicio (segundos) que tiene un valor predeterminado de 90 segundos. Si la inicialización tarda más que el límite de tiempo de inicio, el proceso de trabajo puede finalizar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.