2011-12-15 41 views
20

Realmente no sé por dónde empezar con esta pregunta, pero el sitio en el que estoy trabajando a veces tiene cargas de página muy lentas. Especialmente después de hacer una construcción, pero no siempre. Normalmente tengo que actualizar la página 5-10 veces antes de que realmente aparezca. Creo que estoy tratando de ver dónde exactamente debería comenzar a mirar.ASP.NET MVC 3 La carga del sitio es extremadamente lenta

ASP.NET MVC 3 Ninject AutoMapper entidad Código Marco Primera 4.1 SQL Server 2008 Razor

ACTUALIZACIONES

En cuanto a algunas de las preguntas, se puede hacer esto en cada tiempo de carga página, pero después de que se carga es bastante rápido en todas las páginas.

Después de publicar esto y conseguir sus respuestas que inicia la aplicación y todavía se está cargando y probablemente no volverá a cargar a menos que haga clic en el navegador de recarga.

No hay almacenamiento en caché, y los modelos EF no son enormes.

estoy usando la maquinilla de afeitar y Visual Studio 2010 con 6 GB de memoria y un procesador I7.

Estoy usando IIS Express y el servidor web predeterminado cuando se depura. También hace esto en IIS7 en el servidor principal.

Puedo consultar MVC Profiler y Glimpse para ver qué puedo encontrar.

Debajo tengo un código que se ejecuta cuando llega a la página de inicio. Yo diría que nunca se carga cuando inicio el servidor por primera vez. Puse un punto de quiebre en el modelo var que nunca se golpea. Si vuelvo a cargar la página, entonces lo hace.

public ActionResult Index() 
     { 
      var model = new HomeViewModel(); 

      model.RecentHeadlines = _headlineService.GetHeadlines(1, Config.RecentHeadlinesPageSize, string.Empty); 

      return View(model); 
     } 

A continuación se muestra la configuración de mi entorno de datos también.

public class DatabaseFactory : Disposable, IDatabaseFactory 
    { 
     private DataContext _dataContext; 
     public DataContext Get() 
     { 
      return _dataContext ?? (_dataContext = new DataContext()); 
     } 
     protected override void DisposeCore() 
     { 
      if (_dataContext != null) 
       _dataContext.Dispose(); 
     } 
    } 

public class Disposable : IDisposable 
    { 
     private bool isDisposed; 

     ~Disposable() 
     { 
      Dispose(false); 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
     private void Dispose(bool disposing) 
     { 
      if (!isDisposed && disposing) 
      { 
       DisposeCore(); 
      } 

      isDisposed = true; 
     } 

     protected virtual void DisposeCore() 
     { 
     } 
    } 

public class UnitOfWork : IUnitOfWork 
    { 
     private readonly IDatabaseFactory _databaseFactory; 
     private DataContext _dataContext; 

     public UnitOfWork(IDatabaseFactory databaseFactory) 
     { 
      _databaseFactory = databaseFactory; 
     } 

     protected DataContext DataContext 
     { 
      get { return _dataContext ?? (_dataContext = _databaseFactory.Get()); } 
     } 

     public void Commit() 
     { 
      DataContext.Commit(); 
     } 
    } 
+1

Necesita más detalles. ¿Esto es para golpear la primera página? Cada página? ¿Solo ciertas páginas? ¿Sucede de manera constante o esporádica? – Lester

+0

¿Qué tan grande es tu modelo EF? ¿Hay algún almacenamiento en caché en su aplicación? ¿Es especialmente después de la compilación o siempre cuando accede a la aplicación después de la compilación por primera vez (reinicio de la aplicación)? –

+0

También podría deberse a una máquina lenta. ¿Cuanta memoria tienes? ¿Cuántos núcleos de CPU? ¿Es una computadora portátil o una estación de trabajo? – danludwig

Respuesta

14

Comenzaría comprobando los tiempos de espera establecidos en IIS para que el proceso se recicle.

También soy un gran admirador de la MVC Mini-Profiler, que podría mostrarle exactamente cuánto tiempo tardan varias partes de la carga de su página, definitivamente échele un vistazo.

Editar:

Vale la pena señalar que el Glimpse project también es ideal para esta tarea en estos días.

+0

Bien, instalé el perfil MVC Mini y me dio una pista. Estaba haciendo una larga solicitud de ajax de sondeo a un método controlador que era asincrónico. Algo estaba sucediendo, como no limpiarse ni detenerse cuando salí de la página. Después de comentar este código, las páginas comenzaron a cargarse, excepto la inicial que se esperaba. –

+2

+1 para el MiniProfiler. – avenmore

6

suena como que podría ser un problema con IIS AppPool reciclaje Si experimenta después construye o después de períodos de inactividad.

Para ayudar con AppPool tiempos de espera se puede utilizar un batch file he creado para ayudar a mitigar el problema.

Eso no va a resolver el problema para usted después de edificios de nueva construcción debido a que su aplicación ASP.NET MVC tiene que ser compilado JIT durante la primera ejecución. Si realmente está ansioso por eliminar ese problema, puede usar ASP.NET precompliation.

+1

Me gusta su punto acerca de la AppPool. +1 –

+0

Guau, esto hizo una gran diferencia. Ya no tengo que esperar 5 segundos para que el servidor de prueba se caliente cada vez que lo visito ocasionalmente. ¿Cuál fue el valor predeterminado de idleTimeout? – avenmore

+0

@avenmore que depende de tu host; en general, creo que el tiempo de espera predeterminado es de 20 minutos, pero no estoy seguro de inmediato. Es una práctica recomendada establecerlo explícitamente si tiene ese nivel de acceso a IIS en mi humilde opinión. – Aaronontheweb

1

Trate Glimpse o utilizar ASP.NET Tracing.

También puede precompile your views si está utilizando el motor Razor view a través del Razor Single File Generator for MVC.

+2

Otros elementos que puede verificar son ** dependencias externas de MVC **, como ** Estado de sesión **, ** Servicios de datos **, etc. que podrían estar causando la desaceleración. Acabamos de tener un problema en el que el tráfico excesivo de estado de sesión de SQL Server provocó que el sitio se rastreara (* además de más de 200 usuarios *). Esto no aparecía en el rastreo. – SliverNinja

0

Depende de lo que sucedió en su ejecución anterior, a veces si arroja un error y no borra eso, entonces tendrá problemas al ejecutar la aplicación. Ayuda reiniciar el navegador cada vez que compila si hubo un error.

Sin embargo, esto podría ser un problema de almacenamiento en caché. Es posible que su base de datos esté almacenando en caché debido a la eliminación de contexto mal mantenida. Esto haría que las búsquedas se ejecuten cada vez más rápido a medida que se encuentran en las páginas. Asegúrese de llamar siempre a .dispose() cuando termine con las transacciones de su base de datos.

0

funny - He notado algo similar una vez con unity y mvc pero el problema creo que se resolvió solo. También puede probar el generador de perfiles de hormigas para ver si el problema está fuera de MVC.

Si deja que una sola solicitud se presente allí (sin solicitar más de 5 veces), ¿qué ocurre? Deje que se ejecute una sola solicitud: ¿ALGUNO de su código es afectado? (configuración de inicio de sesión log4net, nlog, etc.) para ejecutar application_start, etc. para ver si se está llamando a algún código después de la compilación.

Cuestiones relacionadas