2011-05-18 54 views
2

我有一個進程顯示〜4,294,965,900「當前邏輯線程」(根據性能計數器)和〜400個物理線程。令人難以置信的邏輯線程數量; windbg不能看到他們?

我已經使用ADPlus(-hang)創建了內存轉儲,而windbg(!線程)僅向我顯示物理線程。

如何找出所有這些邏輯線程來自哪裏?

+0

第一個數字看起來像一個bug,但是除非在* huge *多核服務器上運行,否則即使是400個線程也是非常糟糕的。 – 2011-05-19 05:59:05

+0

當我將MS SQL Express 2005包含到項目中時,我已經看到了這一點,您是否有代碼中的任何MS SQL訪問權限,並且可以刪除它們以查看邏輯線程是否歸因於它們? – Martin 2011-05-19 07:46:41

+0

它運行在一個令人印象深刻的服務器上。 – Mark 2011-05-20 14:01:04

回答

0

如何找出所有這些邏輯線程來自哪裏?

他們不是。他們不存在。除非你在一臺64位機器上運行,噢,比如至少的內存容量爲128GB的RAM,否則你根本不可能擁有4億個線程的。每個線程,無論是「物理」操作系統線程,還是某個框架提供的,至少需要某種標識符。如果這是一個32位數字,那麼僅僅存儲這些標識符將佔用近16GB的RAM。 (當然,你將剩下大約1600個未使用的標識符)。如果標識符是64位寬,則需要32GB RAM。最重要的是,每個線程都需要一些堆棧空間(一個常見的默認值是1MB,這使我們可以達到4PB的內存)。

這是一個錯誤。線程不存在,性能計數器因某種原因向您報告垃圾值。

例如,它可能是一個負面的錯誤代碼,當轉換爲無符號整數時,它會變成這個龐大的數字。

或者它可能是一些其他的錯誤條件。

4

對我來說,這看起來像一個可疑的高數字。

表示爲無符號32位整數的數字-1396是4,294,965,900,而1396看起來更合理。

某個地方可能存在bug?

+0

性能監視器中的錯誤? ...中的錯誤? – Mark 2011-05-18 17:59:32

+0

而且,重申的是,當然這是一個可疑的高數字。這就是爲什麼我想弄清楚他們在哪裏。請記住,WinDbg只顯示〜400個物理線程,所以不,我不認爲實際上有~1400個線程。 – Mark 2011-05-18 18:00:58

+0

我沒有得到upvotes?你如何有一個負數的線程?這個數字來自Windows性能計數器,它是一個64位數字。 – Mark 2011-05-18 19:40:10

0

由於您的進程正在運行託管代碼,因此邏輯線程數可能會引用CLR線程。 .Net在CLR邏輯線程和物理線程之間進行映射。要進一步調查,可以在Windbg中使用!threads命令。這是此命令的輸出示例:


0:028> !threads 
ThreadCount:  25 
UnstartedThread: 0 
BackgroundThread: 22 
PendingThread: 0 
DeadThread:  3 
Hosted Runtime: yes 
            PreEmptive GC Alloc    Lock 
     ID OSID ThreadOBJ State GC   Context  Domain Count APT Exception 
    0 1 12b0 007b69d0  4220 Enabled 120337b4:12034a3c 007afef8  0 STA 
    6 2 1f70 007c2688  b220 Enabled 11ed2a84:11ed4a3c 007afef8  0 MTA (Finalizer) 
    7 3 2340 007c8ac8  1220 Enabled 00000000:00000000 007afef8  0 Ukn 
    11 4 1c4c 0aaf3380  7220 Enabled 00000000:00000000 007afef8  0 STA 
    13 8 2414 0d4932f0  220 Enabled 00000000:00000000 007afef8  0 Ukn 
    3 a 2780 0d4d08e8 1009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    15 7 970 0d4d0df0 1009220 Enabled 11ed4ad8:11ed6a3c 007afef8  0 MTA (Threadpool Worker) 
    19 9 2510 0d4d12f8 200b220 Enabled 00000000:00000000 007afef8  0 MTA 
    20 b 80c 0d4d1800 200b220 Enabled 00000000:00000000 007afef8  0 MTA 
    21 c 2490 0d4d1d08 200b220 Enabled 00000000:00000000 007afef8  0 MTA 
    23 d 2724 0d4d2210 1009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    24 e 2200 0d4d2718 1009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    26 f 1f3c 0d4d2c20 1009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    25 10 200c 0d4d3128 1009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    27 11 2708 0d4d3630 1009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    17 6 21b4 0d4d3b38 1009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    18 5 2148 0d4d4548  220 Enabled 00000000:00000000 007afef8  0 MTA 
XXXX 16  0d4d6378  19820 Enabled 00000000:00000000 007afef8  0 MTA 
XXXX 15  0d4d5e70  19820 Enabled 00000000:00000000 007afef8  0 MTA 
    30 14 112c 0d4d5968 200b220 Enabled 00000000:00000000 007afef8  0 MTA 
    32 13 2734 0d4d5460  b220 Enabled 00000000:00000000 007afef8  0 MTA 
    33 12 11ec 0d4d4a50 100a220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Worker) 
    34 17 166c 0d4d6880 8009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Completion Port) 
    35 18 24f4 0d4d6d88 8009220 Enabled 00000000:00000000 007afef8  0 MTA (Threadpool Completion Port) 
XXXX 19  0d4d7798  19820 Enabled 00000000:00000000 007afef8  0 Ukn 

請注意,在輸出頂部打印出統計數據。如果發現大量死線,可能表示資源泄漏。查看此類資源泄漏的one example

在!線程輸出中,左列是非管理線程標識(與~命令顯示的相同),第二列是CLR線程標識,第三列是操作系統線程標識。

+0

對,你會注意到我這樣做了,只顯示了物理線程。 – Mark 2011-05-20 14:00:25

相關問題