2011-05-18 15 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

相关问题