2011-11-21 57 views
12

我正在使用dotTrace Performance 4.5来分析.NET 3.5 C#Web应用程序。当我记录一个“用户请求”(页面加载)时,我看到11个线程的时间大约相同,为7644毫秒。C#Web应用程序优化:PerformWaitCallback

  • 大多数线程描述只包含: 100%[本地或优化的代码 - 7644毫秒
  • 一个人说: 100%Microsoft.VisualStudio.WebServer.WebServerApp.Main(String[])
  • 最后一曰:
    • 86%System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)
    • 14%PerformWaitCallback(1094ms)>> 12%= ProcessRequest

你能告诉我:

  • 为什么有这么多线程? (图片资源,AJAX,JavaScript)
  • 什么是PerformWaitCallback
  • 为什么7644毫秒只有1094毫秒的工作?
+1

你只测量一个*请求吗?你应该启动应用程序并运行*多个*请求;启动Web应用程序涉及固有的开销。 – casperOne

+0

我在分析一个请求之前“加热”应用程序。如果我运行多个请求(N x 8秒),我会得到类似的结果。 –

+1

可能取决于您使用的是IIS,IIS Express还是Web Development Server。 –

回答

1

关于PerformWaitCallback,这是引用来源有说:

回拨帮手。该功能将请求分派给 用户回调。工作项目从循环中的每个应用程序域 队列中提取,直到没有更多工作或者量子已经过期为止。量子被强制保持 之间的公平性。

您可以看到完整的代码here

顺便说一句,我不知道,如果你看到这个.NET 4.5 - 从参考源再次(找不到一个在线版本,你就必须从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

为什么会有这么多的线程? (图片资源,AJAX,JavaScript)

Web服务器创建一个线程池来管理传入请求,并且池中有多个线程。

什么是PerformWaitCallback?

不知道是肯定的,但它看起来像等待一个线程池线程完成其任务的代码。

为什么7644毫秒只有1094毫秒的工作?

它看起来像分析器正在计算一些线程正在等待新工作的时间。我没有使用dotTrace,但大多数分析器都有一种方法来配置它们,以便他们可以确定线程在等待还是在工作 - 基于您发布的信息,我怀疑探查器配置不正确。

+0

对不起,我迟到的答案,但我正在解决的性能问题。如果我使用DotTrace监视IIS,则没有更多'PerformWaitCallback',但具有相同时差的'System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr,Int32)'... –