我正在使用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 ms)>> 12% =ProcessRequest
- 86%
能告诉我吗?
- 为什么有这么多线程?(图片资源,AJAX, JavaScript)
- 为什么只有1094毫秒的工作需要7644毫秒?
PerformWaitCallback
是什么?为什么有这么多线程?(图片资源,AJAX, JavaScript)
web服务器创建一个线程池来管理传入的请求,池中有许多线程。
什么是PerformWaitCallback?
不确定,但看起来像是等待线程池线程完成任务的代码。
为什么只有1094毫秒的工作需要7644毫秒?
看起来分析器正在计算一些线程等待新工作所花费的时间。我没有使用dotTrace,但是大多数分析器都有一种方法来配置它们,这样它们就可以识别线程何时在等待与工作——基于你发布的信息,我怀疑分析器配置得不太正确。
关于PerformWaitCallback
,这是参考源必须说的:
回叫助手。该函数将请求分派给user-callbacks。工作项是从每个应用域中获取的在循环中排队,直到没有更多的工作或量子有更多的工作过期了。执行量刑是为了保持公平appdomains。
你可以在这里看到完整的代码。
顺便说一句,我不确定你是否会在。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();
}
}