线程使用率的增加-查找需求的位置

问题描述 投票:0回答:2

我有一个Windows wcf Web应用程序,在服务端,我们创建有状态会话。当会话数超过特定阈值时,新请求将在.net级别排队。我们认为这是由于某些.net错误导致,当.net默认线程池线程的需求突然激增时,.net无法足够快地发出线程。因此,新请求将排队等待,直到.net从挂起中恢复并发出thradpool线程以接受传入的请求。

我们正在尝试弄清线程的突然需求是从哪里来的。当线程数开始增加时,我对w3wp进程进行了转储。

我在windbg中运行了!uniqstack命令,我注意到下面的堆栈在接近400个线程中很常见。这个堆栈是什么意思?是否都在等待某些IO完成?这400个线程是IO完成端口线程吗?

.561  Id: c504.ce10 Suspend: 0 Teb: 00000038`f6d90000 Unfrozen
      Start: clr!Thread::intermediateThreadProc (00007ff9`d1bbc150)
      Priority: 0  Priority class: 32  Affinity: fff
 # Child-SP          RetAddr           Call Site
00 00000038`f997f068 00007ff9`dfbabcff ntdll!ZwRemoveIoCompletion+0x14 [d:\rs1.obj.amd64fre\minkernel\ntdll\daytona\objfre\amd64\usrstubs.asm @ 251]
01 00000038`f997f070 00007ff9`d1ccea3c KERNELBASE!GetQueuedCompletionStatus+0x3f [d:\rs1\minkernel\kernelbase\error.c @ 844]
02 00000038`f997f0d0 00007ff9`d1bbc1cf clr!ThreadpoolMgr::CompletionPortThreadStart+0x210 [f:\dd\ndp\clr\src\vm\win32threadpool.cpp @ 3770]
03 00000038`f997f170 00007ff9`e1c184d4 clr!Thread::intermediateThreadProc+0x86 [f:\dd\ndp\clr\src\vm\threads.cpp @ 2872]
04 00000038`f997fb30 00007ff9`e285e8b1 kernel32!BaseThreadInitThunk+0x14 [d:\rs1\base\win32\client\thread.c @ 64]
05 00000038`f997fb60 00000000`00000000 ntdll!RtlUserThreadStart+0x21 [d:\rs1\minkernel\ntdll\rtlstrt.c @ 997]

但是根据下面的命令,IO完成端口线程的数量很少。

0:000> !threadpool
CPU utilization: 3%
Worker Thread: Total: 492 Running: 492 Idle: 0 MaxLimit: 32767 MinLimit: 360
Work Request in Queue: 1
    AsyncTimerCallbackCompletion TimerInfo@000001e7a14ffcd0
--------------------------------------
Number of Timers: 1
--------------------------------------
Completion Port Thread:Total: 3 Free: 3 MaxFree: 24 CurrentLimit: 3 MaxLimit: 1000 MinLimit: 12
.net wcf threadpool windbg io-completion-ports
2个回答
0
投票

由于您拥有WinDbg ;-)我不是专家,但是已经整理了一些有用的命令,例如两个:

从已加载的内容中搜索通配符函数,这将提供在函数处设置断点的确切名称:

x *!*CreateThread*

在函数上设置跟踪点,在深度处记录调用堆栈:

bp ntdll!ZwCreateThreadEx "k 10; gc"

也许这会提供一些有关什么触发新线程创建的见解,也许将线程添加到现有池中。

还有许多不错的WinDbg策略参考站点,例如http://www.windbg.info/,这是我所掌握的知识的极限。

也有WCF的参考源,但是它很大,如果您有一些调用堆栈上下文并知道在源中搜索什么,那将真正有帮助。


0
投票

Tess Ferrandez,前Microsoft升级工程师,似乎将您的案子完全列为要忽略的事情之一。在她的网站If broken it is, fix it you should 上,这样提到:

空闲CLR完成端口/ IO线程

14 Id: efc.11c8 Suspend: 1 Teb: fff8e000 Unfrozen
ChildEBP RetAddr Args to Child 
0209fe7c 7d50664c 00000234 0209fee8 0209fec0 ntdll!NtRemoveIoCompletion+0x15
0209fea8 79f795de 00000234 0209feec 0209fee8 kernel32!GetQueuedCompletionStatus+0x29
0209ff14 79f7997f 00000000 00000000 00000000 mscorwks!ThreadpoolMgr::CompletionPortThreadStart+0x11a
0209ffb8 7d4dfff1 0019c440 00000000 00000000 mscorwks!ThreadpoolMgr::intermediateThreadProc+0x49
0209ffec 00000000 79f79939 0019c440 00000000 kernel32!BaseThreadStart+0x34

我不知道为什么!threadpool无法识别它们。

© www.soinside.com 2019 - 2024. All rights reserved.