How to find our ThreadPool workflow?

I have 100% CPU utilization in w3wp.exe, and the top 3 threads by CPU are shown below

When I switch to one of the threads in question (for example, 18), I get an error below when I try to get through the call, so I assume this is unmanaged code, as well as the "k" and "dumpstack" below

So myquestion - how do you know what the entire processor consumes for these Theadpool workflows?

0:018> !runaway User Mode Time Thread Time 15:12a4 0 days 0:13:15.359 18:830 0 days 0:10:49.046 17:1084 0 days 0:10:47.343 12:fc 0 days 0:00:36.828 ... 0:018> !threadpool CPU utilization 100% Worker Thread: Total: 3 Running: 0 Idle: 3 MaxLimit: 100 MinLimit: 1 Work Request in Queue: 6 -------------------------------------- Number of Timers: 8 -------------------------------------- Completion Port Thread:Total: 1 Free: 1 MaxFree: 2 CurrentLimit: 0 MaxLimit: 100 MinLimit: 1 0:018> !threads ThreadCount: 10 UnstartedThread: 0 BackgroundThread: 10 PendingThread: 0 DeadThread: 0 Hosted Runtime: no PreEmptive GC Alloc Lock ID OSID ThreadOBJ State GC Context Domain Count APT Exception 7 1 1078 016eced8 8220 Enabled 00000000:00000000 016e84d0 0 Ukn 12 2 fc 016fb0c8 b220 Enabled 00000000:00000000 016e84d0 0 MTA (Finalizer) 10 3 1148 01717b60 880a220 Enabled 00000000:00000000 016e84d0 0 MTA (Threadpool Completion Port) 13 4 680 0171dad8 80a220 Enabled 00000000:00000000 016e84d0 0 MTA (Threadpool Completion Port) 14 5 9b8 0171e470 1220 Enabled 00000000:00000000 016e84d0 0 Ukn 15 6 12a4 017629f0 180b220 Enabled 00000000:00000000 016e84d0 0 MTA (Threadpool Worker) 3 7 1188 016ef888 220 Enabled 00000000:00000000 016e84d0 0 Ukn 17 8 1084 003085e8 180b220 Enabled 00000000:00000000 016e84d0 0 MTA (Threadpool Worker) 18 9 830 03e433b8 180b220 Enabled 00000000:00000000 016e84d0 0 MTA (Threadpool Worker) 19 a f3c 03e79448 220 Enabled 00000000:00000000 016e84d0 0 Ukn 0:018> !clrstack OS Thread Id: 0x830 (18) Failed to start stack walk: 80004005 0:018> k ChildEBP RetAddr 077ef7a4 76630a91 ntdll!ZwWaitForSingleObject+0x15 077ef810 75711194 KERNELBASE!WaitForSingleObjectEx+0x98 077ef828 6ec25497 kernel32!WaitForSingleObjectExImplementation+0x75 077ef86c 6ec253e3 mscorwks!PEImage::LoadImage+0x1af 077ef8bc 6ec25402 mscorwks!CLREvent::WaitEx+0x117 077ef8d0 6ec8b75f mscorwks!CLREvent::Wait+0x17 077ef950 6ec8bbed mscorwks!ThreadpoolMgr::SafeWait+0x73 077ef9b4 6ed8305a mscorwks!ThreadpoolMgr::WorkerThreadStart+0x11c 077efc58 7571339a mscorwks!Thread::intermediateThreadProc+0x49 077efc64 77559ef2 kernel32!BaseThreadInitThunk+0xe 077efca4 77559ec5 ntdll!__RtlUserThreadStart+0x70 077efcbc 00000000 ntdll!_RtlUserThreadStart+0x1b 0:018> !dumpstack OS Thread Id: 0x830 (18) Current frame: ntdll!ZwWaitForSingleObject+0x15 ChildEBP RetAddr Caller,Callee 077ef7a4 76630a91 KERNELBASE!WaitForSingleObjectEx+0x98, calling ntdll!ZwWaitForSingleObject 077ef810 75711194 kernel32!WaitForSingleObjectExImplementation+0x75, calling KERNELBASE!WaitForSingleObjectEx 077ef828 6ec25497 mscorwks!PEImage::LoadImage+0x1af 077ef854 6eea07a9 mscorwks!UM2MDoADCallBack+0x98, calling mscorwks!_EH_epilog3 077ef86c 6ec253e3 mscorwks!CLREvent::WaitEx+0x117, calling mscorwks!PEImage::LoadImage+0x180 077ef89c 6ec243ea mscorwks!UnsafeEELeaveCriticalSection+0x25, calling mscorwks!DECTHREADNONHOSTLOCKCOUNT 077ef8a8 6ec243ab mscorwks!CrstBase::Leave+0x8c, calling mscorwks!UnsafeEELeaveCriticalSection 077ef8bc 6ec25402 mscorwks!CLREvent::Wait+0x17, calling mscorwks!CLREvent::WaitEx 077ef8d0 6ec8b75f mscorwks!ThreadpoolMgr::SafeWait+0x73, calling mscorwks!CLREvent::Wait 077ef8f8 6ec2d529 mscorwks!GCHolder<1,0,1>::GCHolder<1,0,1>+0x29, calling mscorwks!Thread::DisablePreemptiveGC 077ef900 6ec299cc mscorwks!Thread::EnablePreemptiveGC+0xf, calling mscorwks!Thread::CatchAtSafePoint 077ef950 6ec8bbed mscorwks!ThreadpoolMgr::WorkerThreadStart+0x11c, calling mscorwks!ThreadpoolMgr::SafeWait 077ef9b4 6ed8305a mscorwks!Thread::intermediateThreadProc+0x49 077ef9d0 77559e83 ntdll!LdrInitializeThunk+0x1a, calling ntdll!NtContinue 077efc44 6ed83048 mscorwks!Thread::intermediateThreadProc+0x37, calling mscorwks!_alloca_probe_16 077efc58 7571339a kernel32!BaseThreadInitThunk+0xe 077efc64 77559ef2 ntdll!__RtlUserThreadStart+0x70 077efca4 77559ec5 ntdll!_RtlUserThreadStart+0x1b, calling ntdll!__RtlUserThreadStart 
+4
source share
1 answer

Yes, this is unmanaged code.

Try profiling your code to determine how much of your code is being absorbed by the processor. There are some free code profilers, check out this thread: https://stackoverflow.com/questions/308816/any-good-free-net-profiler

+2
source

Source: https://habr.com/ru/post/1444663/


All Articles