我有一個生產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