ASP.NET核心应用程序在NtWaitForSingleObject中挂起了16000多个线程 - 它们在做什么?

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

我们有一个ASP.NET Core 2.1应用程序正在生产中,有时(每天一次,每两天或三天)挂起并不再提供请求。这导致来自IIS的502错误放在前面。只有让事情再次起作用的选项似乎重启了应用程序。

在使用WinDbg检查内存转储时,我们注意到几乎所有的线程(我们推送最少数量的Threadpool线程)都有一个相当小的堆栈跟踪并且卡在WaitForSingleObject中而不是我们的应用程序代码中的某个位置。输出是使用WinDbg命令!mex.us生成的。

16352 threads [stats]: 27 29 37 38 39 40 41 42 43 44 ...
    00007ff898d85b84 ntdll!NtWaitForSingleObject+0x14
    00007ff895e93eef KERNELBASE!WaitForSingleObjectEx+0x8f
    00007ff885a1826a clr!CLRSemaphore::Wait+0x8a
    00007ff885a190cf clr!ThreadpoolMgr::UnfairSemaphore::Wait+0x115
    00007ff885a1927f clr!ThreadpoolMgr::WorkerThreadStart+0x28b
    00007ff885ac5abf clr!Thread::intermediateThreadProc+0x86
    00007ff8982f84d4 kernel32!BaseThreadInitThunk+0x14
    00007ff898d4e851 ntdll!RtlUserThreadStart+0x21

这些线程是否在积极地等待其他事情发生,或者它们是否完成了他们的工作而只是闲置,等待新的事情要做?

如果第一个假设是正确的(这可以解释挂起的应用程序),为什么堆栈跟踪不指向他们正在等待的原始调用?

c# asp.net-core threadpool windbg
1个回答
0
投票

具有该堆栈的线程正在等待工作,并且可能没有兴趣找到您的挂起。

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