ASP.NET Core应用程序与NtWaitForSingleObject中的16000多个线程一起挂起-它们在做什么?

时间:2019-04-05 13:38:10

标签: c# asp.net-core threadpool windbg

我们有一个正在生产的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

这些线程是在积极地等待其他事情发生吗,还是只是在空闲时等待新的事情发生而完成工作?

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

1 个答案:

答案 0 :(得分:0)

具有该堆栈的线程正在等待工作,可能对找到挂起不感兴趣。