13

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

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

你能告诉我吗:

  • 为什么会有这么多线程?(图片资源、AJAX、JavaScript)
  • 是什么PerformWaitCallback
  • 为什么只有 1094 毫秒的工作需要 7644 毫秒?
4

2 回答 2

3

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

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

什么是 PerformWaitCallback?

不确定,但它看起来像等待线程池线程完成其任务的代码。

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

看起来分析器正在计算一些线程等待新工作所花费的时间。我没有使用 dotTrace,但大多数分析器都有配置它们的方法,以便它们可以识别线程何时等待与工作 - 根据您发布的信息,我怀疑分析器配置不正确。

于 2011-12-03T00:08:39.083 回答
1

关于PerformWaitCallback,这是参考来源必须说的:

回调助手。此函数将请求分派给用户回调。工作项在循环中从每个应用程序域队列中获取,直到没有更多工作或时间片已过期。强制执行量子以保持应用域之间的公平性。

你可以在这里看到完整的代码。

顺便说一句,我不确定你是否会在 .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();
    } 
}
于 2013-05-20T13:52:18.797 回答