当报告的线程来自线程池时,!runaway 命令有用吗?

Is !runaway command useful when the reported threads are from the thread pool?

据我所知,线程池线程在其生命周期内提供不同的 "masters" 服务,在繁忙的应用程序中,这样的线程实际上可能会存活很长时间。

似乎这样的线程在 !runaway 输出中产生误报。

在这种情况下,此命令的用处将大大降低。

我说得对还是漏掉了什么?

EDIT1

WCF/Asp.NET 请求线程呢?它们也被回收了吗?如果是这样,那就什么都没有了。 I/O 当然,完成线程也被回收了。

To the best of my understanding a thread pool thread serves different "masters" during its lifetime

是的。

and in a busy application such a thread may actually live for long.

是的。

It seems that such a thread generates a false positive in the !runaway output.

这取决于"false positive"的定义。

在任何情况下,这都是对您所知道的应用程序正在做什么以及您观察到它实际做什么的解释。如果匹配,一切都很好,如果不匹配:调查。例如。如果您有一个线程池,则期望 !runaway 成为一个表示已完成工作量的数字。

但这并没有错:该线程实际上已经消耗了那么多 CPU 时间。这样一想,就不算误报了。

这里的问题是:为什么你首先 运行 !runaway?可能您想分析性能问题。在这种情况下,故障转储不太适合,因为它们只代表一个时间点。对于性能分析,您需要连续的信息。

如果你幸运并且有丰富的经验,你可能会从故障转储中解决性能问题,例如如果我没记错的话,著名的 Mark Russinovich 已经解决了一些 Exchange Server 问题,方法是采取一系列(!)故障转储,比较堆栈跟踪并发现某些病毒扫描程序做了太多工作。

这里的关键点是:一系列故障转储,因此您可以确认它仍然存在,例如在一个无限循环左右。执行此操作的工具是 ProcDump,它具有 -c 开关以在高 CPU 时触发。将它与 -n 一起使用以写入多个转储,并与 -s 一起定义转储之间的时间。

ProcDump 仍然不是理想的工具。您真正需要的是一种将性能分解为单一方法的工具。像 dotTrace Performance Profiler (now part of Resharper Ultimate) or XPerf 或类似的工具。

回答你的问题:

Is !runaway command useful when the reported threads are from the thread pool?

!runaway 正确。有助于"named"线程(var t = new Thread();)情况下的性能分析。对线程池线程的性能分析帮助不大