Perché dopo ogni riavvio, i siti .NET locali impiegano del tempo a caricarsi per la prima volta? [chiuso]


27

Sto sviluppando siti basati sulla piattaforma .NET. Di solito distribuisco questi siti sul mio IIS locale, in modo da poterli testare e vedere le loro funzionalità prima di andare in diretta. Tuttavia, ogni volta che riavvio Windows, sembra che i siti richiedano molto tempo per essere eseguiti per la prima volta.

Conosco JIT e sono anche a conoscenza di questa domanda , ma non risponde alla mia domanda.

JIT si verifica ogni volta che riavvii Windows? È legato alla creazione del processo w3wp.exe? Perché i siti sono così lenti per la prima richiesta dopo ogni riavvio?


3
Questo è noto come "avvio a freddo" o qualcosa del genere. Il sistema deve caricare il w3wp in memoria, che necessita anche di tutte le DLL correlate, probabilmente roba JIT, elaborazione delle tabelle di importazione, lettura dei dati dal disco, in quanto non è nella cache RAM, ecc.
Coder

@Coder, +1 per il tuo commento. Ma potresti spiegare di più in una risposta, in modo che io e altri sviluppatori ne trarremmo vantaggio. :)
Saeed Neamati

IIS non è la mia specialità, quindi spero che qualcuno dia una risposta migliore. Ecco un argomento simile che ho iniziato qualche tempo fa stackoverflow.com/questions/3807791/cold-startup-optimization Forse ti aiuterà di più.
Coder

4
Questa domanda sembra fuori tema perché riguarda un problema di implementazione e non un problema di programmazione concettuale.

Risposte:


32

Questo problema è la compilazione JIT. Il pool di applicazioni richiede tempo per creare le librerie prima di poter iniziare a elaborarle. Questo può essere accelerato usando uno script di riscaldamento, ma è qualcosa che deve accadere. Dipende anche se stai usando un sito Web o un progetto di applicazione web. Un sito Web è JIT per ogni pagina, quindi il primo hit è lento e anche ogni nuovo hit della pagina ha un tempo di compilazione aggiuntivo. I progetti di applicazioni Web sono precompilati, quindi non dovrebbero subire questo colpo così gravemente, ma le librerie devono ancora essere caricate. Più librerie / strumenti hai, peggio tende a essere questo successo. Ecco alcuni link che parlano del riscaldamento:

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 /


6
Questo è per lo più corretto ma c'è una differenza tra compilazione e jitting che non è chiara in questa risposta. Jitting sta compilando il bytecode .NET in codice macchina. ASP.NET sta effettivamente compilando quelle pagine Web, anche in un progetto di applicazione Web (a meno che non si usi aspnet_compiler). Tutto quel tempo di compilazione / compilazione, oltre al tempo di caricamento di librerie e librerie, è il motivo per cui è così lento.
Aaronaught,

JIT è sinonimo di just-in-time. Non vi è alcuna differenza tra "jitting" e "compilazione", oltre i tempi e la quantità di codice che viene compilato. Inoltre, la compilazione JIT avviene solo per ciascun codice non visitato , non necessariamente per ogni pagina. Se usano lo stesso modello, ad esempio, la compilazione non è necessaria. L'osservazione che più librerie portano a più tempo impiegato per la compilazione è completamente vera, ovviamente.
Cornelius,

9

La reazione lenta alla prima richiesta è perché IIS avvia / carica solo un sito o un pool di applicazioni sulla prima richiesta in arrivo. E dopo un determinato periodo di tempo, nessuna nuova richiesta in arrivo arriva al server IIS arresta nuovamente il sito (riciclaggio del pool di app).

ASP.NET 4.0 ha una nuova funzionalità chiamata avvio automatico. Con questa funzione è possibile impostare un pool di applicazioni o un singolo sito per avviarsi prima di qualsiasi richiesta. Questo viene attivato all'avvio (all'avvio di IIS) o quando si aggiorna un sito ASP.NET (che arresta il sito).

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

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

È necessario IIS 7.5 per utilizzare questo.

C'è anche un'opzione per eseguire alcune attività extra quando si avvia l'avvio automatico, ad es. per precaricare i dati nella cache.


Normalmente si compila l'intero sito prima di inserirlo sul server Web, quindi il codice non deve essere più compilato alla prima richiesta. JIT viene utilizzato solo per i siti che utilizzano la cartella App_code in cui si pubblica il codice sorgente con il sito Web.
Stief,

2

Parte del problema è anche il GAC. Le librerie nei luoghi in cui dovranno essere controllate la sicurezza ogni volta che vengono caricate, ciò significa che viene eseguito un intero carico di lavori di tipo crittografato e questo rallenta molto le cose. Qualche tempo fa da parte della SM si parlava delle prestazioni di WPF che descrivevano questo problema: la loro risposta era "non mettere roba nel GAC se non si può farne a meno"


1
Dovrebbe essere "può aiutarlo" per evitare un doppio negativo
Richard Szalay,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.