我有一个生产CPU问题,经过几天的常规活动后突然CPU开始达到峰值。我保存了转储文件并运行!runaway命令以获取CPU时间最长的线程列表。的输出低于:WinDbg失控命令输出解释
用户模式时间
线程时间
21:1100天10:51:39.781
19:F840天10:41:59.671
5:CC4 0 0天:53:25.343
48:74 0 0天:34:20.140
47:1670 0 0天:34:09.812
13:460 0 0天:32:57.640
8:14d40天0:19 :30.546
7:d90 0天0:03:15.00 0
23:1520 0 0天:02:21.984
22:CA00天0:02:08.375
24:72℃0 0天:02:01.640
29:10AC0天0:01:58.671
27:1088 0 0天:01:44.390
正如你所看到的,输出显示我有2个线程:21 & 19,消耗超过20小时的CPU时间相结合,我能跟踪其中1个线程的调用堆栈,如下所示:
〜21S
!CLRStack输出不会在此刻没关系,让我们把它叫做“X调用堆栈”
我想什么,是有关!失控命令输出的解释。据我所知,转储文件是应用程序当前状态的快照。所以我的问题是:
- 失控命令如何显示线程21的10:51小时值,当转储过程只需要几秒钟?
- 这是否意味着使用!CLRStack命令找到的X调用堆栈的特定“实例”挂起超过10个小时?或者它是21线程执行整个X调用堆栈执行的总时间?如果是这样的话,看起来很奇怪的是21个线程负责这么多的X调用堆栈的执行。据我所知的起源是一个web请求(运行时应该指定每个呼叫随机线程)
我有一个猜测,可能回答这些2个问题:
也许在WinDbg通过计算时间取得线程调用堆栈的实际时间并将其除以转储过程的范围,因此,例如,如果X调用堆栈的特定执行时间为1秒,整个转储过程需要3秒钟(33%),而进程正在运行输出总共24小时将显示:
8小时(24小时的33%)
我是对的,还是完全搞错了?
'!runaway'命令只显示线程自创建以来花费的CPU时间。在进行转储时,它可能会或可能不会与调用堆栈有关。如果您想查看调用树中每个函数花费的时间,则需要[使用分析器](https://msdn.microsoft.com/en-us/library/ms182372.aspx)。 (顺便说一句,你可以通过'!runaway 7'获得更多有关CPU和壁挂时间的信息。) –
将usertime和kerneltime复制到来自kernelmode结构成员的转储kthread在转储时以特定间隔更新最后更新的时间被复制并显示windbg windbg只是显示的东西 – blabb