我们有一个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
这些线程是否在积极地等待其他事情发生,或者它们是否完成了他们的工作而只是闲置,等待新的事情要做?
如果第一个假设是正确的(这可以解释挂起的应用程序),为什么堆栈跟踪不指向他们正在等待的原始调用?
具有该堆栈的线程正在等待工作,并且可能没有兴趣找到您的挂起。