有没有办法记录IIS线程池线程的使用?

时间:2012-02-11 14:14:41

标签: asp.net iis logging asynchronous threadpool

我想知道来自池中的确切线程何时被释放以及何时被释放。

我想要的是探索第三方库的行为,以决定是否应该使用其异步方法。如果这些方法阻止来自公共池的线程,那么使用它们将不会为ASP.NET应用程序带来任何好处。库被混淆了,所以我不想用反编译器搜索答案。

2 个答案:

答案 0 :(得分:1)

您提出问题的方式就像您需要一个监控程序的调试器。

现在你的程序中你知道从池中调用线程时以及何时释放它 - 不是吗?

如果你不控制程序,你想要查看和跟踪其他程序,然后它的声音就像一般调试器。这可以通过使用c / c ++和大量代码的钩子函数来完成。

sysinternals的进程资源管理器可以实时为您提供开放线程,如果您单击池并查看属性。

另一方面,我认为ThreadPool.GetAvailableThreads可以在您需要的时刻为您提供您所要求的信息。

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getavailablethreads.aspx

如果您可以提供有关您真正尝试归档的内容的更多信息并缩小您的问题,从一般调试程序到更具针对性的需求。

答案 1 :(得分:1)

如果您希望某个事件或某种类型的公共挂钩能够告诉您ThreadPool线程正在做什么,那么很遗憾没有这样的事情。

我可以想到另外两种可能有用的方法:

首先,您可以在调用库之前和之后检查ThreadPool.GetAvailableThreads()的workerThreads结果的值。如果值发生变化,库可能就是罪魁祸首。在您只处理单个请求的测试环境中,这很可能是有意义的。您还可以在自定义Windows性能计数器中保存workerThreads编号,并随时跟踪它 - 可能使用它来比较一种方法与另一种方法。

这是一篇描述性能计数器方法的文章的链接:

http://msdn.microsoft.com/en-us/library/ff650682.aspx

如果你使用的是IIS 7+,另一种可能性是禁用MaxConcurrentRequestsPerCPU(通过.NET 4.0+中的HostingEnvironment,或通过.NET 3.5或更高版本中的aspnet.config文件)将其设置为零,并将MaxConcurrentThreadsPerCPU设置为相对较小的数字,并使用库中的一个界面与另一个界面测量加载时应用程序的性能。如果请求由于没有足够的线程而排队,响应时间将相应地跳转。不幸的是,有关如何执行此操作以及执行哪些测量的详细信息取决于库和Web请求的结构。