Domanda

Ho un'applicazione client / server. Le piste dei componenti del server, utilizza WCF in modo 'servizi remoti' (formattatore binario, oggetti di sessione).

Se inizio il componente server e avviare il client, il primo compito il server non viene completata in <0,5sec.

Se inizio la componente server con debugger VS allegata, quindi avviare il client, il compito prende verso l'alto di 20 secondi per completare.

Non ci sono cambiamenti di codice - nessun cambiamento di compilazione condizionale. Lo stesso accade se ho il componente server compilato e funzionante in a 32-bit, 64-bit, con il processo di hosting VS, senza il processo di hosting VS, o qualsiasi combinazione di queste cose.

Possibilmente importante : Se uso il VS.NET profiler (modalità di campionamento), poi le corse app come veloce come se non ci fosse debugger. Quindi non posso diagnosticare in questo modo. Appena controllato, modalità strumentazione gestisce anche rapidamente. Lo stesso vale per la concorrenza la modalità di profilatura, impianti rapidamente.

Dati salienti:

  • L'applicazione utilizza abbastanza multithreading pesante (40 thread nel pool filettatura standard). Creare i fili avviene rapidamente, indipendentemente e non è un punto lento. Ci sono molte serrature, WaitHandles e modelli Monitor
  • L'applicazione non solleva eccezioni a tutti.
  • L'applicazione non crea alcun output della console.
  • codice
  • L'applicazione è interamente gestito.
  • L'app fa mappare alcuni file su disco per un file mappato in memoria: 1x750MB e 12x8MB e alcuni più piccoli

Prestazioni misurate:

  • uso della CPU è minimo in entrambi i casi; quando debugger è collegato, CPU siede a <1%
  • uso della memoria è minima in entrambi i casi; forse 50 o 60 MB in entrambi i casi
  • Ci sono un sacco di errori di pagina che accadono (ref MMF), tuttavia si verificano più lentamente quando il debugger è collegato
  • Se il processo di hosting VS non viene utilizzato, o fondamentalmente la 'Monitorare Debug remoto' entra in gioco, allora che utilizza una quantità di CPU decente e crea un buon numero di page fault. Ma non è l'unica volta che si verifica il problema
  • La differenza di prestazioni è visto a prescindere dal modo in cui il cliente viene eseguito. L'essere unica variabile cambiato è il componente server gestito via 'Inizia con il debug' vs lanciata da Explorer.

Le mie idee:

  • WCF lento quando il debug?
  • MemoryMappedFiles lento quando il debug?
  • 40 fili usati - lenta per eseguire il debug? Forse Monitor / serrature notificare debugger? programmazione dei thread diventa strano contesto / cambia molto poco frequenti?
  • radiazione cosmica di fondo concessione intelligenza e crudele senso dell'umorismo per VS

Tutto sembra stupidamente improbabile.

Quindi, le mie domande:

  1. Perché succede questo?
  2. Se # 1 sconosciuta, come posso diagnosticare / scoperto?
È stato utile?

Soluzione

Eccezioni può notevolmente influire sulle prestazioni di un'applicazione. Ci sono due tipi di eccezioni: 1 ° eccezioni di possibilità (quella con grazia maneggiato con un blocco try / catch), e le eccezioni non gestite (che alla fine mandare in crash l'applicazione)

.

Per impostazione predefinita, il debugger non mostra 1st eccezioni di possibilità, mostra solo le eccezioni non gestite. E per impostazione predefinita, mostra anche uniche eccezioni che si verificano nel codice. Tuttavia, anche se non le visualizza, li gestisce ancora, quindi la sua performance può essere influenzato (specialmente in prove di carico, o grandi tirature anello).

Per attivare la prima possibilità eccezioni vengono visualizzati in Visual Studio, cliccare su "Debug | Eccezioni" per richiamare la finestra Eccezioni, e verificare "gettato" nella sezione "Common Language Runtime" (si può essere più specifico e scegliere Wich prima possibilità un'eccezione si vuole vedere).

Per consentire prima eccezioni di possibilità di visualizzazione provenienti da qualsiasi punto dell'applicazione, non solo dal codice, fare clic su "Strumenti | Opzioni | debug | Generale". E disattivare l'opzione "Attiva Just My Code"

E per questi specifici casi "modalità forensics", ho anche fortemente consiglio di abilitare .NET Framework Fonte Stepping (richiede "Attiva Just My Code" per essere disattivato). E 'molto utile per capire cosa sta succedendo, a volte solo guardando lo stack di chiamate è molto stimolante - e disponibile, soprattutto nel caso di disguido radiazione cosmica: -)

Due legato articoli interessanti:

Altri suggerimenti

Dato che questo è uno dei primi risultati quando googling per questo problema vorrei aggiungere la mia soluzione problema qui nella speranza di salvare qualcuno 2 ore di ricerca, come nel mio caso.

Il mio codice rallentato da 30 secondi, senza debugger a 4 minuti con debugger. perché ho dimenticato di rimuovere un punto di interruzione condizionale. Questi sembrano rallentare l'esecuzione enormemente, in modo da guardare fuori per coloro

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