2011-12-15 20 views
20

Non so davvero da dove cominciare con questa domanda, ma il sito su cui sto lavorando a volte ha dei carichi di pagina veramente lenti. Soprattutto dopo aver fatto una build, ma non sempre. Di solito devo aggiornare la pagina 5-10 volte prima che si presenti effettivamente. Immagino che sto cercando di vedere esattamente dove dovrei cominciare a guardare.ASP.NET MVC 3 Il caricamento del sito è estremamente lento

ASP.NET MVC 3 Ninject automapper Entity Framework Codice First 4.1 SQL Server 2008 Razor

AGGIORNAMENTI

Per quanto riguarda alcune delle domande, si può fare questo carico a lungo su ogni pagina, ma dopo si carica abbastanza velocemente su tutte le pagine.

Dopo aver postato questo e aver ricevuto le risposte, ho avviato l'applicazione e ancora si sta caricando e probabilmente non verrà mai caricata a meno che non clicco su ricarica nel browser.

Nessun caching ei modelli EF non sono enormi.

Sto usando Razor e Visual Studio 2010 con 6 GB di memoria e un processore I7.

Sto usando IIS Express e il server Web predefinito durante il debug. Lo fa anche su IIS7 sul server principale.

Posso guardare nel MVC Profiler e Glimpse per vedere cosa riesco a trovare.

Di seguito, ho un codice che viene eseguito quando raggiunge la home page. Direi che non carica mai quando avvio il server per la prima volta. Metto un punto di rottura al modello var che non viene mai colpito. Se ricarico la pagina, allora lo fa.

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

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

      return View(model); 
     } 

Di seguito è riportata anche la configurazione del datacontext.

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

Ho bisogno di ulteriori dettagli. È questo per colpire la prima pagina? Ogni pagina? Solo alcune pagine? Succede costantemente o sporadicamente? – Lester

+0

Quanto è grande il tuo modello EF? C'è qualche caching nella tua applicazione? È soprattutto dopo la build o sempre quando si accede all'applicazione dopo la build per la prima volta (riavvio dell'applicazione)? –

+0

Potrebbe anche essere dovuto a una macchina lenta. Quanta memoria hai? Quanti core della CPU? È un computer portatile o una workstation? – danludwig

risposta

14

mi piacerebbe iniziare controllando ciò che i timeout sono impostati in IIS per il processo di essere il riciclaggio stesso.

Sono anche un grande fan dello MVC Mini-Profiler che potrebbe mostrare esattamente per quanto tempo le varie parti della tua pagina di caricamento stanno prendendo, sicuramente dare un'occhiata a questo.

Edit:

Vale la pena notare che la Glimpse project è grande anche per questo compito in questi giorni.

+0

Bene ho installato MVC Mini profiler e mi ha dato un indizio. Stavo facendo una richiesta ajax di polling lunga a un metodo di controller che era asincrono. Stava accadendo qualcosa però, come non essere ripulito o fermarsi quando ho lasciato la pagina. Dopo aver commentato questo codice, le pagine hanno iniziato a caricarsi, tranne che per la costruzione iniziale prevista. –

+2

+1 per MiniProfiler. – avenmore

6

Sembra che potrebbe esserci un problema con il riciclaggio AppPool di IIS se lo si sta verificando dopo le build o dopo periodi di inattività.

Per aiutare con i timeout di AppPool, è possibile utilizzare uno batch file creato per aiutare a mitigare il problema.

Questo non risolverà il problema dopo le nuove build perché l'applicazione ASP.NET MVC deve essere compilata JIT al primo avvio. Se sei davvero desideroso di eliminare questo problema, puoi utilizzare ASP.NET precompliation.

+1

Mi piace il tuo punto su AppPool. +1 –

+0

Wow, questo ha fatto una grande differenza. Non devo più aspettare 5 secondi perché il mio server di test si scaldi ogni volta che lo visita occasionalmente. Qual è stato l'idleTimeout predefinito? – avenmore

+0

@avenmore che dipende dall'host; in generale penso che il timeout predefinito sia 20 minuti ma non ne sono sicuro. È consigliabile impostarlo in modo esplicito se si dispone di tale livello di accesso a IIS IMHO. – Aaronontheweb

1

Provare Glimpse oppure utilizzare ASP.NET Tracing.

È possibile anche precompile your views se si utilizza il motore di visualizzazione Razor tramite Razor Single File Generator for MVC.

+2

Altri elementi che puoi controllare sono ** dipendenze MVC esterne ** - come ** Stato sessione **, ** Servizi dati **, ecc. Che potrebbero causare il rallentamento. Abbiamo appena riscontrato un problema in cui il traffico eccessivo dello stato della sessione di SQL Server ha causato la scansione del sito (* aggiunta di oltre 200 utenti *). Questo non si presentava nella traccia. – SliverNinja

0

Dipende da ciò che è accaduto nella corsa precedente, a volte se si genera un errore e non lo si elimina, si verificheranno problemi durante l'esecuzione dell'applicazione. Aiuta a riavviare il browser ogni volta che si crea se si è verificato un errore.

Tuttavia, questo potrebbe essere un problema di memorizzazione nella cache. È possibile che il database si stia memorizzando nella cache a causa di una disposizione del contesto mal gestita. Ciò farebbe sì che le ricerche funzionino sempre più velocemente come sono state rilevate nelle pagine. Assicurati di chiamare sempre .dispose() quando hai finito con le transazioni del tuo database.

0

divertente - Ho notato qualcosa di simile una volta con unità e mvc ma il problema credo sia risolto da solo. Puoi anche provare il profiler delle formiche per vedere se il problema è al di fuori di MVC.

Se si lascia una singola richiesta sedersi lì (senza richiedere più di 5 volte) cosa succede? Esegui una singola richiesta - QUALUNQUE del tuo codice ha colpito? (setup logging log4net, nlog, etc) per eseguire application_start, ecc. per vedere se un codice viene chiamato dopo la compilazione.

Problemi correlati