【问题标题】:C# Web Application Tuning : PerformWaitCallbackC# Web 应用程序调优:PerformWaitCallback
【发布时间】:2012-01-03 00:29:40
【问题描述】:

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

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

你能告诉我吗:

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

【问题讨论】:

  • 您是否只测量 一个 请求?您应该启动应用程序并运行 多个 请求;启动 Web 应用程序会产生固有的开销。
  • 我在分析一个请求之前“加热”了应用程序。如果我运行多个请求(N x 8 秒),我会得到类似的结果。
  • 可能取决于您使用的是 IIS、IIS Express 还是 Web 开发服务器。
  • 此跟踪是使用 WebDevServer 进行的。
  • 为了更好地测试使用 IIS,RedGate 还有一个非常有用的内存分析器 ANTS Profiler,我更喜欢使用它

标签: c# asp.net profiling profile dottrace


【解决方案1】:

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

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

什么是 PerformWaitCallback?

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

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

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

【讨论】:

  • 对不起,我的回答迟了,但我正在解决性能问题。如果我使用 DotTrace 监控 IIS,则不再有 PerformWaitCallback,但 System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32) 具有相同的时差...
【解决方案2】:

关于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();
    } 
}

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多