2012-11-14 7 views
101

IIS ha una caratteristica fastidiosa per i siti Web a basso traffico in cui ricicla i processi di lavoro inutilizzati, causando il primo utente al sito dopo qualche tempo per ottenere un ritardo estremamente lungo (30+ secondi).Correzione del caricamento iniziale lento per IIS

Ho cercato una soluzione al problema e ho trovato queste soluzioni potenziali.

A. Use the Application Initialization plugin

B. Use Auto-Start with .NET 4

C. Disable the idle-timeout (under IIS Reset)

D. Precompile the site

Mi chiedo quale di queste è preferito, e ancora più importante, perché ci sono così molte soluzioni allo stesso problema? (La mia ipotesi è che non lo sono, e sto solo non capendo qualcosa correttamente).

Modifica

Performing C sembra essere sufficiente per mantenere il mio sito riscaldato, ma ho scoperto che la vera radice della lentezza del mio sito ha a che fare con Entity Framework, che posso' Sembra che capisca perché sta andando freddo. Vedi la domanda this, che purtroppo non ha ancora ricevuto risposta ha risposto!

Alla fine ho dovuto solo fare uno warm up script per colpire il mio sito di tanto in tanto per assicurarsi che sia rimasto veloce.

+0

Ciao amico, sta eseguendo abbastanza C? Perché ? Abbiamo solo bisogno di usarlo o di disabilitare anche il riciclaggio? Mi sento sempre al secondo giorno prima richiesta molto lenta di IIS7.5 – qakmak

risposta

26

Le opzioni A, B e D sembrano essere nella stessa categoria poiché influenzano solo l'ora di inizio iniziale, eseguono il riscaldamento del sito Web come la compilazione e il caricamento delle librerie in memoria.

L'utilizzo di C, l'impostazione del timeout di inattività, dovrebbe essere sufficiente affinché le richieste successive al server vengano pubblicate rapidamente (il riavvio del pool di applicazioni richiede un po 'di tempo, nell'ordine dei secondi).

Per quanto ne so, esiste il timeout per il salvataggio della memoria che potrebbe richiedere altri siti Web in esecuzione su una macchina parallela. Il prezzo è quel tempo di caricamento lento una volta.

Oltre al fatto che il pool di applicazioni viene arrestato in caso di inattività dell'utente, anche il pool di applicazioni viene riciclato per impostazione predefinita ogni 1740 minuti (29 ore).

Da TechNet:

pool di applicazioni Internet Information Services (IIS) può essere riciclato periodicamente per evitare di stati instabili che possono portare a crash applicazione, si blocca, o le perdite di memoria.

Finché riciclo del pool di applicazione è lasciato su, dovrebbe essere sufficiente. Ma se vuoi davvero prestazioni di prim'ordine per la maggior parte dei componenti, dovresti anche usare qualcosa come il Modulo di inizializzazione dell'applicazione che hai citato.

+0

Quindi consiglieresti di disabilitare il timeout di inattività? Ciò causerebbe problemi lungo la linea (suppongo che sia lì per un motivo)? –

+0

Questo in realtà non risolve il mio problema (vedi la mia modifica), ma ho accettato dal momento che hai risposto alla mia domanda originale. –

2

Io userei B perché, in concomitanza con il riciclaggio dei processi di lavoro, ci sarà solo un ritardo durante il riciclaggio. Ciò evita il ritardo normalmente associato all'inizializzazione in risposta alla prima richiesta dopo l'inattività.Puoi anche mantenere i benefici del riciclaggio.

1

Vedere questo articolo per suggerimenti su come aiutare i problemi di prestazioni. Questo include entrambi i problemi di prestazioni relativi all'avvio, nella sezione "avvio a freddo". La maggior parte di questo sarà importante indipendentemente dal tipo di server che si sta utilizzando, localmente o in produzione.

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

Se l'applicazione deserializza qualsiasi cosa, da XML (e che comprende servizi web ...) assicurarsi SGEN viene eseguito su tutti i binari coinvolti nella deseriaization e posizionare le DLL risultanti nella Global Assembly Cache (GAC) . Questo precompila tutti gli oggetti di serializzazione utilizzati dagli assembly a cui è stato eseguito SGEN e li memorizza nella DLL risultante. Ciò può consentire enormi risparmi di tempo sulla prima deserializzazione (caricamento) dei file di configurazione dal disco e le chiamate iniziali ai servizi Web. http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

Se tutti i server IIS non hanno accesso in uscita a internet, si spengono Certificate Revocation List (CRL) per i binari Authenticode aggiungendo generatePublisherEvidence =”false” in machine.config. In caso contrario, durante l'avvio ogni processo di lavoro può bloccarsi per oltre 20 secondi mentre scade il tentativo di connettersi a Internet per ottenere un elenco CRL. http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

considerare l'utilizzo NGEN su tutti i gruppi. Tuttavia, senza un uso attento, questo non dà un gran vantaggio in termini di prestazioni. Questo perché gli indirizzi di caricamento di base di tutti i file binari caricati da ciascun processo devono essere impostati con attenzione in fase di compilazione per non sovrapporsi. Se i binari devono essere ridefiniti quando vengono caricati a causa di conflitti di indirizzi, la maggior parte delle prestazioni di utilizzo di NGEN andranno perse. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

2

Scrivi ping service/script di colpire il vostro sito web di inattività è piuttosto un modo migliore per andare perché si avrà un controllo completo. Altre opzioni che hai menzionato sarebbero disponibili se hai affittato una scatola di hosting dedicata.

In uno spazio di hosting condiviso, gli script di riscaldamento sono la migliore difesa di primo livello (l'autoaiuto è l'aiuto migliore). Ecco un articolo che condivide un idea on how to do it from your own web application.

+0

ha appena aggiornato questo thread precedente, nel caso qualcuno cercasse lo stesso –

6

Web Hosting Sfida

Bisogna ricordare che nessuna delle opzioni di configurazione della macchina sono disponibili se si sono ospitati su un server condiviso, come molti di noi (le aziende più piccole e privati) sono.

ASP.NET MVC Overhead

mio sito hanno almeno 30 secondi quando non è stato colpito in più di 20 minuti (e l'applicazione web è stato arrestato). È terribile.

Un altro modo per testare le prestazioni

C'è un altro modo per verificare se è la vostra ASP.NET MVC start up o qualcos'altro. Rilascia una normale pagina HTML sul tuo sito dove puoi colpirla direttamente.
Se il problema è correlato all'avvio di ASP.NET MVC, la pagina HTML verrà visualizzata quasi immediatamente anche quando l'app Web non è stata avviata.
Ecco come ho riconosciuto per la prima volta che il problema era nell'avvio di ASP.NET MVC. Ho caricato una pagina HTML in qualsiasi momento e caricherò rapidamente. Poi, dopo aver colpito la pagina HTML mi ha colpito uno dei miei URL ASP.NET MVC e mi piacerebbe avere il messaggio Chrome "In attesa di raddev.us ..."

Un altro test con personale Script

Successivamente ho scritto un LINQPad (controlla lo http://linqpad.net per altri) script che avrebbe colpito il mio sito ogni 8 minuti (meno del tempo necessario per scaricare l'app, che dovrebbe essere di 20 minuti) e lo lascio girare per ore .

Mentre la sceneggiatura era in esecuzione, ho colpito il mio sito web e ogni volta il mio sito si presentava incredibilmente veloce. Questo mi dà una buona idea che molto probabilmente la lentezza che stavo vivendo era a causa dei tempi di avvio di ASP.NET MVC.

Ottieni LinqPad ed è possibile eseguire il seguente script: è sufficiente modificare l'URL in proprio e lasciarlo eseguire e testarlo facilmente. Buona fortuna.

NOTA: In LINQPad dovrai premere F4 e aggiungere un riferimento a System.Net aggiungere la libreria che consente di recuperare la pagina.

ANNO: assicurarsi di modificare la variabile URL stringa in modo che punti a un URL che caricherà una rotta dal sito MVC ASP.NET in modo che il motore venga eseguito.

System.Timers.Timer webKeepAlive = new System.Timers.Timer(); 
Int64 counter = 0; 
void Main() 
{ 
    webKeepAlive.Interval = 5000; 
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed; 
    webKeepAlive.Start(); 
} 

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    webKeepAlive.Stop(); 
    try 
    { 
     // ONLY the first time it retrieves the content it will print the string 
     String finalHtml = GetWebContent(); 
     if (counter < 1) 
     { 
      Console.WriteLine(finalHtml); 
     } 
     counter++; 
    } 
    finally 
    { 
     webKeepAlive.Interval = 480000; // every 8 minutes 
     webKeepAlive.Start(); 
    } 
} 

public String GetWebContent() 
{ 
    try 
    { 
    String URL = "http://YOURURL.COM"; 
    WebRequest request = WebRequest.Create(URL); 
    WebResponse response = request.GetResponse(); 
    Stream data = response.GetResponseStream(); 
    string html = String.Empty; 
    using (StreamReader sr = new StreamReader(data)) 
    { 
     html = sr.ReadToEnd(); 
    } 
    Console.WriteLine (String.Format("{0} : success",DateTime.Now)); 
    return html; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message)); 
     return "fail"; 
    } 
} 
2

Una buona opzione per eseguire il ping del sito su una pianificazione è utilizzare Microsoft Flow, che è gratuito per un massimo di 750 "analisi" al mese. È molto facile creare un flusso che colpisce il tuo sito ogni ora per mantenerlo caldo. Puoi persino aggirare il limite di 750 creando un flusso singolo con ritardi che separano più hit del tuo sito.

https://flow.microsoft.com