.net - 线程使用量增加——找到需求在哪里
问题描述
我有一个 Windows wcf Web 应用程序,在服务端,我们创建有状态会话。当会话数超过某个阈值时,新请求会在 .net 级别排队。我们认为这是因为一些 .net 错误,当对 .net 默认线程池线程的需求突然激增时,.net 无法足够快地发出线程。因此,新请求将排队,直到 .net 从挂起中恢复并发出 thradpool 线程以接受传入请求。
我们正试图弄清楚对线程的突然需求来自何处。当线程数开始增加时,我转储了 w3wp 进程。
我在 windbg 中运行了!uniqstack
命令,我注意到下面的堆栈常见于近 400 个线程。这个堆栈是什么意思?这一切都在等待一些 IO 完成吗?这 400 个线程是 IO Completion Port 线程吗?
.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 Completion 端口线程的数量很少。
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
解决方案
前 Microsoft 升级工程师 Tess Ferrandez 似乎准确地将您的案例列为要忽略的事情之一。在她的网站上,如果它坏了,你应该修复它,它是这样提到的:
空闲 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
不认识他们。
推荐阅读
- r - R - 加权计数
- dns - 如何在 docker-compose 中配置 dns-proxy-server 以绑定到非默认 IP 地址
- signal-processing - 如何计算 3D 空间(X、Y、T)中时间序列的 FFT
- android - 在路径上移动项目
- ios - ODR 异常“NSBundleResourceRequest 无法连接到它的辅助守护程序”
- php - phpmailer 去垃圾邮件
- python-3.x - Python:OSError:[Errno -9985] 在 Raspberry PI 3B+ 上使用 Snowboy 和 SpeechRecognition 时设备不可用
- linux - 如何删除仅在包含某些字符串的行之后加倍的行 - linux / bash
- python - Python / Pandas:如果非空或大于零,则划分数据框列
- electron - 松弛样式标题栏