2011-11-21 13 views
12

Utilizzo dotTrace Performance 4.5 per creare il profilo di un'applicazione Web .NET 3.5 C#. Quando registro una "richiesta utente" (carico di pagina), vedo 11 thread con approssimativamente la stessa durata, 7644 ms.C# Ottimizzazione delle applicazioni Web: PerformWaitCallback

  • La maggior parte delle descrizioni filo contengono solo: 100% [madrelingua o codice ottimizzato] - 7644 ms
  • Uno dice: 100% Microsoft.VisualStudio.WebServer.WebServerApp.Main(String[])
  • Ultimo si legge:
    • 86% System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)
    • 14% PerformWaitCallback (1094 ms) >> 12% = ProcessRequest

Puoi dirmi:

  • perché ci sono così tanti fili? (risorse immagini, AJAX, JavaScript)
  • Che cos'è PerformWaitCallback?
  • Perché 7644 ms per solo 1094 ms di lavoro?
+1

Stai misurando solo * una * richiesta? Dovresti avviare l'app ed eseguire * più * richieste; c'è un sovraccarico inerente coinvolto nell'avvio dell'applicazione web. – casperOne

+0

I "riscalda" l'app prima di profilare una richiesta. Ottengo risultati simili se eseguo richieste multiple (N x 8 sec). –

+1

Probabilmente dipende dall'utilizzo di IIS, IIS Express o Web Development Server. –

risposta

1

Per quanto riguarda PerformWaitCallback, questo è ciò che la fonte di riferimento ha da dire: indietro

chiamata aiutante. Questa funzione invia richieste ai callback dell'utente . Gli elementi di lavoro vengono recuperati dalla coda per-appdomain in un ciclo fino a quando non vi è più lavoro o il numero ha scaduto. Il quantum viene applicato per mantenere l'equità tra i domini .

È possibile visualizzare il codice completo here.

BTW, non sono sicuro se si vedrà questo in .NET 4.5 - ancora una volta dalla sorgente di riferimento (non si poteva trovare una versione on-line, dovrete scaricarlo dal http://referencesource.microsoft.com/):

//This type is necessary because VS 2010's debugger looks for a method named 
///_ThreadPoolWaitCallbacck.PerformWaitCallback 
//on the stack to determine if a thread is a ThreadPool thread or not. 
//We have a better way to do this for .NET 4.5, but 
//still need to maintain compatibility with VS 2010. 
//When compat with VS 2010 is no longer an issue, this type may be removed. 
internal static class _ThreadPoolWaitCallback 
{ 
    [System.Security.SecurityCritical] 
    static internal bool PerformWaitCallback() 
    { 
     return ThreadPoolWorkQueue.Dispatch(); 
    } 
} 
3

Perché ci sono così tanti fili? (risorse immagini, AJAX, JavaScript)

Il server Web crea un pool di thread per gestire le richieste in arrivo e ci sono numerosi thread nel pool.

Che cos'è PerformWaitCallback?

Non so per certo, ma sembra il codice che attende un thread di thread thread per completare il suo compito.

Perché 7644 ms per solo 1094 ms di lavoro?

Sembra che il profiler stia contando il tempo che alcuni thread stanno spendendo in attesa di un nuovo lavoro. Non ho usato dotTrace, ma molti profiler hanno un modo per configurarli in modo che possano identificare quando i thread sono in attesa rispetto al lavoro - in base alle informazioni che hai postato, ho il sospetto che il profiler non sia configurato correttamente.

+0

Scusate la mia risposta in ritardo ma stavo lavorando fuori i problemi di prestazioni. Se controllo IIS con DotTrace, non c'è più 'PerformWaitCallback', ma' System.Web.Hosting.ISAPIRuntime.ProcessRequest (IntPtr, Int32) 'con le stesse differenze di orario ... –

Problemi correlati