我们有一个正在生产的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
这些线程是在积极地等待其他事情发生吗,还是只是在空闲时等待新的事情发生而完成工作?
如果第一个假设是正确的(这将解释挂起的应用程序),为什么堆栈跟踪没有指向他们正在等待的原始调用?
答案 0 :(得分:0)
具有该堆栈的线程正在等待工作,可能对找到挂起不感兴趣。