2011-11-21 11 views
12

Estoy utilizando dotTrace Performance 4.5 para perfilar una aplicación web .NET 3.5 C#. Cuando grabo una "solicitud de usuario" (carga de página), veo 11 hilos con aproximadamente el mismo tiempo, 7644 ms.C# Ajuste de aplicación web: PerformWaitCallback

  • La mayoría de las descripciones de rosca sólo se incluirá: 100% [nativo o código optimizado] - 7644 ms
  • Uno dice: 100% Microsoft.VisualStudio.WebServer.WebServerApp.Main(String[])
  • pasado se lee:
    • 86% System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)
    • 14% PerformWaitCallback (1094 ms) >> 12% = ProcessRequest

¿Me puede decir:

  • ¿Por qué hay tantos hilos? (recursos de imágenes, AJAX, JavaScript)
  • ¿Qué es PerformWaitCallback?
  • ¿Por qué 7644 ms por solo 1094 ms de trabajo?
+1

¿Está midiendo solo * una * solicitud? Debe iniciar la aplicación y ejecutar * solicitudes * múltiples; hay una sobrecarga inherente implicada en la puesta en marcha de la aplicación web. – casperOne

+0

"calentar" la aplicación antes de perfilar una solicitud. Obtengo resultados similares si ejecuto múltiples solicitudes (N x 8 seg). –

+1

Probablemente depende de si está utilizando IIS, IIS Express o Web Development Server. –

Respuesta

1

En cuanto PerformWaitCallback, esto es lo que la fuente de referencia tiene que decir:

Devolver la llamada de ayuda. Esta función envía solicitudes al usuario de devolución de llamada . Los elementos de trabajo se obtienen de la cola por dominio de aplicación en un bucle hasta que ya no haya más trabajo o el valor cuántico haya expirado . La cantidad se aplica para mantener la equidad entre appdomains.

Puedes ver el código completo here.

Por cierto, no estoy seguro de si verá esto en .NET 4.5 - nuevo desde la fuente de referencia (no podría encontrar una versión en línea, tendrá que descargarlo desde 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

¿Por qué hay tantos subprocesos? (recursos de imágenes, AJAX, JavaScript)

El servidor web crea un grupo de subprocesos para administrar las solicitudes entrantes, y hay una serie de subprocesos en el grupo.

¿Qué es PerformWaitCallback?

No estoy seguro, pero parece que el código que espera a que un subproceso de la fila de subprocesos complete su tarea.

¿Por qué 7644 ms por solo 1094 ms de trabajo?

Parece que el generador de perfiles está contando el tiempo que algunos hilos están gastando en espera de un nuevo trabajo. No he usado dotTrace, pero la mayoría de los perfiladores tienen una forma de configurarlos para que puedan identificar cuándo están esperando los hilos en lugar de funcionar, según la información que publicaste, sospecho que el generador de perfiles no está configurado del todo bien.

+0

Perdón por mi respuesta tardía pero estaba trabajando en los problemas de rendimiento. Si controlo IIS con DotTrace, ya no hay 'PerformWaitCallback', sino' System.Web.Hosting.ISAPIRuntime.ProcessRequest (IntPtr, Int32) 'con las mismas diferencias horarias ... –