2009-05-03 15 views
8

Implementé recientemente una aplicación ASP.NET en mi brillante nuevo VPS y, aunque estoy contento con el aumento en el rendimiento general que un VPS puede ofrecer sobre una solución de hosting compartido, no estoy satisfecho con el tiempo de inicio de mi aplicación .Cómo mantener mi aplicación ASP.NET siempre "activa", y si es una mala idea, ¿por qué no debería hacerlo?

Mi aplicación web tarda bastante tiempo en arrancar cuando mi cliente la visita por primera vez. No lo estoy ejecutando en modo de depuración (deshabilitado en mi web.config), y no tiene ningún trabajo real que hacer en el inicio - No tengo código en el controlador de eventos de inicio de mi aplicación, no comienzo ningún hilos adicionales, nada. La primera vez que mi cliente golpea mi aplicación, toma unos buenos 15-20 segundos para responder. Las llamadas posteriores tardan de 1 a 2 segundos, a menos que espere unos minutos para que se cierre la aplicación. Luego, vuelve a un tiempo de inicio de 15-20 segundos.

(Soy consciente de que mi referencia de tiempo es muy poco científica, esas cifras solo deberían dar una idea del rendimiento en el inicio de mi aplicación).

Mi comprensión de ASP.NET fue que IIS (7.0, en este caso), compila una aplicación web la primera vez que se ejecuta, y luego almacena esos binarios en caché hasta el momento en que se cambia la aplicación web. ¿Es mi entendimiento incorrecto?

Así, después de que el prefacio tamaño de un libro, aquí están mis preguntas:

  • es mi entendimiento de la compilación de ASP.NET incorrecto? ¿Cómo funciona realmente?
  • ¿Hay alguna forma de forzar a IIS a almacenar en caché mis binarios o mantener mi aplicación activa indefinidamente?
  • Si es una mala idea hacer alguna de las cosas de mi pregunta anterior, ¿por qué es una mala idea y qué puedo hacer para aumentar el rendimiento de inicio?

Gracias!

Editar: aparece mi pregunta es un ligero duplicado de this question (creo que lo hice un mejor trabajo de buscar una respuesta a esta de aquí, jaja). Creo, sin embargo, que mi pregunta es más exhaustiva, y agradecería que no se cerrara como un duplicado a menos que haya mejores preguntas ya formuladas aquí que aborden esto.

+1

Iba a sugerir el mismo enfoque que los otros contestadores de preguntas similares sugeridos. ¿Estás seguro de que las respuestas a esa pregunta no satisfarán tus necesidades? Creo que explican la situación bastante bien. – DOK

+0

@DOK, gracias por sus comentarios, la otra pregunta fue buena en cuanto al "cómo" de mi pregunta, pero creo que mi pregunta cubre más sobre el "por qué" y las mejores prácticas de este tema. –

+1

Creo que el algoritmo de búsqueda utilizado en SO es realmente malo, de ahí los duplicados. –

Respuesta

3

IIS también apaga la aplicación web después de un período de tiempo determinado, según su configuración. No estoy tan familiarizado con IIS7 y dónde configurar esto, por lo que es posible que desee investigar un poco sobre cómo configurar esto (starting point?).

¿Es malo? Depende de qué tan bueno es tu código. Si no está perdiendo memoria o recursos, probablemente no.

La otra solución es precompile your website. Esta podría ser la mejor opción para ti. Deberá verificarlo y verlo, sin embargo, ya que puede tener un inconveniente, dependiendo de cómo interactúa con su sitio web.

+2

Como se mencionó anteriormente, debe establecer el 'Tiempo de espera inactivo' en IIS para asegurarse de que la aplicación no se elimine de la memoria demasiado pronto (el valor predeterminado es de 20 minutos, creo). Esto se suma a la precompilación, el valor máximo está limitado por el tiempo de reciclaje del grupo de aplicaciones, más su propio límite. Aplicaciones Grupos> [Pool en uso]> Configuración avanzada> Tiempo de espera inactivo – rjarmstrong

2

Mi comprensión de ASP.NET era que IIS (7.0, en este caso), compila una aplicación web la primera vez que se ejecuta cada vez, y luego se almacena en caché los archivos binarios hasta el momento en que se cambia la aplicación web . ¿Es mi entendimiento incorrecto?

Eso es correcto. Específicamente, los ensamblajes se crean como instantáneas (que no deben confundirse con la función de instantáneas de servicio de instantáneas de volumen). Esto le permite reemplazar el código en la carpeta sobre la marcha sin afectar las sesiones en ejecución existentes. ASP.NET detectará el cambio y compilará nuevas versiones en el directorio de destino (normalmente Temporary ASP.NET Files). Más sobre este proceso: Understanding ASP.NET Dynamic Compilation

1

Si es simplemente el tiempo de compilación, a menudo el enfoque más eficiente es visitar el sitio web después del reciclaje. Haga una llamada a intervalos regulares para asegurarse de que sea usted el que recibe el retraso de 15 segundos, no su cliente.

Me sorprendería si todo esto es tiempo de compilación (dependiendo del hardware) - ¿tiene muchas instancias de clases estáticas? ¿Hacen mucho trabajo en la puesta en marcha?

Ya sea con rastreo o creación de perfiles, es probable que pueda determinar con bastante rapidez dónde se ha gastado el tiempo de inicio.

En cuanto a por qué es malo mantener un proceso, creo que es debido a la limpieza. No importa cuán bien cuidemos nuestros datos o cuán bien se comporta el GC, hay una buena aclaración realizada al reiniciar el proceso. Cosas como la fragmentación pueden desaparecer y cualquier otro problema de recursos que se acumule con el tiempo se elimina. Por lo tanto, es una mala idea mantener un proceso de servidor ejecutándose indefinidamente.

Cuestiones relacionadas