¿Por qué después de cada reinicio, mis sitios .NET locales tardan en cargarse por primera vez? [cerrado]

27

Estoy desarrollando sitios basados ​​en la plataforma .NET. Por lo general, implemento estos sitios en mi IIS local, para poder probarlos y ver su funcionalidad antes de lanzarlos. Sin embargo, cada vez que reinicio Windows, parece que los sitios tardan mucho tiempo en ejecutarse por primera vez.

Sé acerca de JIT y también estoy al tanto de esta pregunta , pero no responde a mi pregunta.

¿JIT ocurre cada vez que reinicia Windows? ¿Está relacionado con la creación del proceso w3wp.exe? ¿Por qué los sitios son tan lentos para la primera solicitud después de cada reinicio?

Saeed Neamati
fuente
3
Esto se conoce como "arranque en frío" o algo así. El sistema tiene que cargar el w3wp en la memoria, que también necesita todos los archivos DLL relacionados, probablemente cosas JIT, tablas de importación proceso, leer datos desde el disco, ya que no está en la caché de memoria RAM, etc
Coder
@Coder, +1 por tu comentario. Pero, ¿podría explicar más en una respuesta, para que yo y otros desarrolladores utilicen los beneficios? :)
Saeed Neamati
IIS no es mi especialidad, así que espero que alguien dé una mejor respuesta. Aquí hay un tema similar que comencé hace un tiempo stackoverflow.com/questions/3807791/cold-startup-optimization Quizás ayude un poco más.
Codificador
44
Esta pregunta parece estar fuera de tema porque se trata de un problema de implementación y no de un problema de programación conceptual.

Respuestas:

32

Este problema es la compilación JIT. El grupo de aplicaciones necesita tiempo para construir las bibliotecas antes de que pueda comenzar a procesarlas. Esto se puede acelerar utilizando un script de calentamiento, pero es algo que debe suceder. También depende de si está utilizando un sitio web o un proyecto de aplicación web. Un sitio web es JIT para cada página, por lo que el primer éxito es lento y cada nuevo acceso a la página también tiene un tiempo de compilación adicional. Los proyectos de aplicaciones web están precompilados, por lo que no debería sufrir tanto este golpe, pero las bibliotecas aún deben cargarse. Cuantas más bibliotecas / herramientas tenga, peor será este golpe. Aquí hay algunos enlaces que discuten el calentamiento:

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx /programming/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-scripts /

Joel Etherton
fuente
66
Esto es en su mayoría correcto, pero hay una diferencia entre compilar y sacudir que no está clara en esta respuesta. Jitting está compilando el bytecode de .NET en código máquina. ASP.NET está compilando esas páginas web, incluso en un Proyecto de Aplicación Web (a menos que use el aspnet_compiler). Todo ese tiempo de compilación / compilación, más el tiempo de carga de la biblioteca y la sacudida, es la razón por la que es tan lento.
Aaronaught
JIT solo significa justo a tiempo. No hay diferencia entre "sacudir" y "compilar", más allá del tiempo y la cantidad de código que se compila. Además, la compilación JIT solo ocurre para cada código no visitado , no necesariamente para cada página. Si usan la misma plantilla, por ejemplo, la compilación no es necesaria. La observación de que más bibliotecas generan más tiempo para compilar es completamente cierto, por supuesto.
Cornelius
9

La reacción lenta en su primera solicitud se debe a que IIS solo inicia / carga un sitio o grupo de aplicaciones en su primera solicitud entrante. Y después de un período de tiempo fijo, no llegan nuevas solicitudes entrantes al servidor. IIS detiene el sitio nuevamente (reciclaje del grupo de aplicaciones).

ASP.NET 4.0 tiene una nueva característica llamada inicio automático. Con esta función, puede configurar un grupo de aplicaciones o un sitio individual para que se inicie antes de cualquier solicitud. Esto se activa en el momento del arranque (cuando se inicia IIS) o cuando actualiza un sitio ASP.NET (que detiene el sitio).

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

Necesita IIS 7.5 para usar esto.

También hay una opción para realizar ciertas tareas adicionales cuando se inicia el inicio automático, ej. precargar datos en caché.

Stief
fuente
Normalmente compila su sitio completo antes de ponerlo en el servidor web, por lo que el código ya no necesita compilarse en la primera solicitud. JIT solo se usa para sitios que usan la carpeta App_code donde publica su código fuente con el sitio web.
Stief
2

Parte del problema es también el GAC. Los lugares de las bibliotecas deberán verificarse la seguridad cada vez que se carguen, lo que significa que se llevará a cabo una carga completa de trabajo de tipo de cifrado, y esto ralentiza mucho las cosas. Hubo una charla sobre el rendimiento de WPF hace un tiempo de MS que describió este problema: su respuesta fue "no ponga cosas en el GAC si no puede evitarlo"

gbjbaanb
fuente
1
Eso debería ser "puede ayudarlo" para evitar una doble negativa
Richard Szalay