2014-08-29 21 views
5

Quando distribuiamo la nostra applicazione Web, copiamo tutto il codice in una nuova directory e quindi puntiamo su questa nuova directory. Quando lo facciamo, il numero di appdomain aumenta ma non diminuisce mai. Inoltre, il nostro evento Application_End non sembra mai sparare.L'applicazione Web ASP.NET non scarica AppDomains dopo la distribuzione

Per un po 'di tempo sconosciuto, mentre entrambi i set di AppDomain sono ancora segnalati da perfmon, il sistema funziona in modo molto scadente mentre% di tempo in picchi di GC al 100%. Alla fine ricicla il pool di app per far funzionare di nuovo l'app senza problemi.

Ulteriore informazione: l'elenco delle applicazioni mostra 2 sulla mia macchina di sviluppo, ma 4 eseguite sul server live ... abbiamo solo un'applicazione in esecuzione nel pool quindi questo significa che una libreria che stiamo usando sta creando domini app.

Cosa devo fare per provare a eseguire il debug di cosa sta succedendo? Cosa impedirebbe lo scaricamento di un dominio dell'app?

Aggiornamento 9/3/2014

Dopo aver preso un po 'più in dettaglio le informazioni di registro sembra che il problema non è vecchi domini app che soggiornano in giro, è nuovo AppDomain creati durante il riavvio. Invece di avviare una nuova istanza, l'applicazione inizia due. A volte otteniamo application_end dalla vecchia istanza, a volte no.

Aggiornamento 9/4/2014

Entrambe le cose stanno accadendo. Utilizzando Process Explorer, posso vedere su una delle macchine che il vecchio dominio app è ancora lì e ne è stato avviato uno nuovo. Sull'altra macchina c'erano solo 2 domini di app, ma c'era una lacuna nei loro ID sequenziali. Quindi sono iniziate due istanze (riceviamo anche un messaggio di log dall'avvio dell'app), uno dei quali è morto quasi istantaneamente, lasciando 2 domini dell'app.

+0

Sei, per caso, utilizzando il caching di ASP.NET con uno schema di sfratto che ricarica la cache quando scade? –

+0

Utilizziamo la cache dell'applicazione ASP.NET. Inseriamo le cose con una scadenza continua in base al timeout della sessione degli utenti. Tuttavia non ricarica nulla da solo. –

+0

Cosa intendi per "scadenza continua"? Vuoi dire che aggiorni la scadenza? Quello che stavo chiedendo è se ricaricare la cache o meno quando gli oggetti scadono in base a una richiamata dal gestore cache –

risposta

2

Sebbene non sia sicuro che questo sia l'UNICO motivo per cui l'app non scaricava le appdomain, è certamente una delle ragioni. La risposta effettiva è molto meno interessante dei passi che ho usato per capirlo.

  1. Ho scritto un piccolo script rubino per fare solo 100 di richieste in 10 thread contro la nostra app (l'impostazione di jmeter richiederebbe più tempo di questa).
  2. Eseguire lo script e apportare modifiche al file di configurazione dell'app molte volte durante l'esecuzione. Ci sono voluti un paio di minuti.
  3. Ho utilizzato Process Explorer per confermare che c'erano effettivamente 4 domini di app ancora caricati nel processo.
  4. Ho eseguito procdump e creato un file di dump.
  5. caricato il file ProcDump in Visual Studio e cliccato su "Debug con Managed Only" (anche se non avevo idea se il bug era in codice gestito o meno)
  6. Debugger fermato su una riga di codice in cui il thread che ha chiamato Application_End era in attesa che una coda finisse l'elaborazione. Osservando i valori delle variabili sono stato in grado di dire che la coda non stava più andando ad elaborare gli articoli, ma stavamo per aspettare che la coda fosse vuota.
  7. Cambiato il codice e riavviato il processo, questa volta tutti i domini delle app avviati dalle mie modifiche alla configurazione Web sono stati scaricati.
2

Una cosa che si potrebbe verificare, per risolvere:

Process Explorer in realtà ha una scheda .NET Assemblies che elenca tutti i AppDomain caricati da un processo. NOTA: la scheda viene visualizzata solo per i processi che utilizzano .NET Framework.

+0

Grazie, dal momento che il codice che ha funzionato per elencare i domini dell'app non funziona per qualche strana ragione sul processo di istanza in tempo reale, l'esploratore mi ha permesso di visualizzare gli AppDomain. Al momento ci sono 4. SharedDomain, DefaultDomain e quindi due istanze di ciò che sembra la nostra applicazione. –

+0

Se solo sapessi che cosa stava mantenendo il dominio dell'app. –