Come mantenere sempre attiva la mia app ASP.NET & # 8220; & # 8221; e se è una cattiva idea, perché non dovrei farlo?

StackOverflow https://stackoverflow.com/questions/817655

  •  03-07-2019
  •  | 
  •  

Domanda

Di recente ho distribuito un'applicazione ASP.NET sul mio nuovo e brillante VPS e mentre sono soddisfatto dell'aumento generale delle prestazioni che un VPS può offrire su una soluzione di hosting condiviso, non sono soddisfatto del tempo di avvio del mio applicazione.

La mia applicazione web impiega molto tempo per avviarsi quando il mio client la colpisce per la prima volta. Non lo sto eseguendo in modalità debug (disabilitato nel mio web.config), e non ha alcun vero lavoro da fare all'avvio - Non ho codice nel gestore degli eventi di avvio dell'applicazione, non avvio alcun fili extra, niente. La prima volta che il mio client colpisce la mia applicazione, ci vogliono 15-20 secondi per rispondere. Le chiamate successive richiedono 1-2 secondi, a meno che non aspetto alcuni minuti affinché la mia applicazione venga chiusa. Quindi torna a un tempo di avvio di 15-20 secondi.

(Sono consapevole che il mio benchmark di temporizzazione è molto poco scientifico, quei numeri dovrebbero dare un'idea delle prestazioni all'avvio della mia app).

La mia comprensione di ASP.NET è stata che IIS (7.0, in questo caso), compila un'applicazione Web la prima volta che viene mai eseguita, quindi memorizza nella cache quei file binari fino a quando l'applicazione Web non viene modificata. La mia comprensione è errata?

Quindi, dopo quella prefazione delle dimensioni di un libro, ecco le mie domande:

  • La mia comprensione della compilazione di ASP.NET è errata? Come funziona davvero?
  • Esiste un modo per forzare IIS a memorizzare nella cache i miei binari o mantenere la mia applicazione in vita indefinitamente?
  • Se è una cattiva idea fare una delle cose nella mia domanda precedente, perché è una cattiva idea e cosa posso fare invece per aumentare le prestazioni di avvio?

Grazie!

Modifica: sembra che la mia domanda sia un leggero duplicato di questa domanda (pensavo di aver fatto un lavoro migliore nel cercare una risposta qui, ahah). Penso, tuttavia, che la mia domanda sia più completa e apprezzerei se non fosse stata chiusa come duplicata, a meno che non ci siano domande migliori e già poste qui che affrontano questo problema.

È stato utile?

Soluzione

IIS arresta anche l'app Web dopo un determinato periodo di tempo, a seconda della sua configurazione. Non ho familiarità con IIS7 e dove configurarlo, quindi potresti voler fare una piccola ricerca su come configurarlo ( punto di partenza? ).

È male? Dipende da quanto è buono il tuo codice. Se non stai perdendo memoria o risorse, probabilmente no.

L'altra soluzione è precompilare il tuo sito web . Questa potrebbe essere l'opzione migliore per te. Dovrai verificarlo e vedere, tuttavia, poiché potrebbe avere un aspetto negativo, a seconda di come interagisci con il tuo sito Web.

Altri suggerimenti

  

La mia comprensione di ASP.NET è stata che IIS (7.0, in questo caso), compila un'applicazione Web la prima volta che viene mai eseguita, quindi memorizza nella cache quei file binari fino a quando l'applicazione Web non viene modificata. La mia comprensione è errata?

È corretto. In particolare, gli assiemi vengono creati come copie shadow (da non confondere con il servizio snapshot del volume / funzionalità di copia shadow). Ciò consente di sostituire al volo il codice nella cartella senza influire sulle sessioni di esecuzione esistenti. ASP.NET rileverà la modifica e compilerà le nuove versioni nella directory di destinazione (in genere File ASP.NET temporanei ). Altre informazioni su questo processo: Comprensione della compilazione dinamica ASP.NET

Se è solo il tempo di compilazione, spesso l'approccio più efficiente è quello di colpire il sito Web da soli dopo il riciclo. Effettua una chiamata a intervalli regolari per assicurarti che sei tu a ricevere il ritardo di 15 secondi e non il tuo cliente.

Sarei sorpreso se fosse tutto il tempo di compilazione (a seconda dell'hardware) - hai molte istanze statiche di classi? Fanno molto lavoro all'avvio?

Con il tracciamento o la profilazione, probabilmente potresti capire abbastanza rapidamente dove è stato impiegato il tempo di avvio.

Per quanto riguarda il motivo per cui mantenere un processo in giro è una cattiva idea, credo che sia dovuto al chiarimento. Non importa quanto bene prendiamo cura dei nostri dati o quanto bene si comporti il ??GC, c'è un buon chiarimento eseguito riavviando il processo. Cose come la frammentazione possono scomparire e qualsiasi altro problema di risorse che si accumula nel tempo viene eliminato. Pertanto è una pessima idea mantenere un processo server in esecuzione indefinitamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top