Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 640个企业库缓存线程-如何?_Multithreading_Enterprise Library_Windbg - Fatal编程技术网

Multithreading 640个企业库缓存线程-如何?

Multithreading 640个企业库缓存线程-如何?,multithreading,enterprise-library,windbg,Multithreading,Enterprise Library,Windbg,我们有一个正在进行性能测试的应用程序。今天,我决定转储w3wp并将其加载到windbg中,以查看封面下发生了什么。想象一下我跑步时的惊讶吧!线程,并看到有640个背景线程,几乎所有这些线程都表示: OS Thread Id: 0x1c38 (651) Child-SP RetAddr Call Site 0000000023a9d290 000007ff002320e2 Microsoft.Practices.EnterpriseLibrary.Caching.

我们有一个正在进行性能测试的应用程序。今天,我决定转储w3wp并将其加载到windbg中,以查看封面下发生了什么。想象一下我跑步时的惊讶吧!线程,并看到有640个背景线程,几乎所有这些线程都表示:

OS Thread Id: 0x1c38 (651)
Child-SP         RetAddr          Call Site
0000000023a9d290 000007ff002320e2 Microsoft.Practices.EnterpriseLibrary.Caching.ProducerConsumerQueue.WaitUntilInterrupted()
0000000023a9d2d0 000007ff00231f7e Microsoft.Practices.EnterpriseLibrary.Caching.ProducerConsumerQueue.Dequeue()
0000000023a9d330 000007fef727c978 Microsoft.Practices.EnterpriseLibrary.Caching.BackgroundScheduler.QueueReader()
0000000023a9d380 000007fef9001552 System.Threading.ExecutionContext.runTryCode(System.Object)
0000000023a9dc30 000007fef72f95fd System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
0000000023a9dc80 000007fef9001552 System.Threading.ThreadHelper.ThreadStart()
如果让我猜一下,我想我们的应用程序每次运行都会产生一个线程-我们有2个应用程序服务器,20个并发用户,并且运行了大约30次测试…就在附近

这是“预期行为”,还是我们实施了一些不正确的行为?测试在几个小时前运行,因此我预计任何超时都已经发生

编辑:谢谢大家的回复。有人要求显示有关callstack的更多详细信息-以下是的输出!来自sosex.dll的mk


ESP重新寻址
00:U 00000000 23A9CB38 00000000 775F72CA ntdll!ZwWaitForMultipleObjects+0xa
01:U 00000000 23A9CB40 00000000 773CBC03内核32!WaitForMultipleObjectsEx+0x10b
02:U 00000000 23A9CC50 000007 FEF8F595 mscorwks!WaitForMultipleObjectsEx\u SO\u容错+0xc1
03:U 00000000 23A9CCF000000 7FEF8F59F49 MSCorks!线程::DoAppropriateAptStateWait+0x41
04:U 00000000 23A9CD50 000007 FEF8E55B99 MSCorks!线程::DoAppropriateWaitWorker+0x191
05:U 00000000 23A9CE50 00000 7月8日EFE8 MSCorks!线程::DoAppropriateWait+0x5c
06:U 00000000 23A9CEC0 000007 FEF8F0DC7A MSCorks!CLREvent::WaitEx+0xbe
07:U 00000000 23A9CF70 00000 7FEF8FBA72E MSCorks!线程::块+0x1e
08:U 00000000 23A9CFA000000 1996年2月7日mscorwks!SyncBlock::等待+0x195
09:U 00000000 23A9D0C000000 7FEF9463D3F mscorwks!ObjectNative::WaitTimeout+0x12f
0a:M 00000000 23A9D290 000007ff002321b3***错误:模块加载已完成,但无法加载Microsoft.Practices.EnterpriseLibrary.Caching.DLL的符号
Microsoft.Practices.EnterpriseLibrary.Caching.ProducerConsumerQueue.WaitUntilInterrupted()(+0x0 IL)(+0x11本机)
0b:M 00000000 23A9D2D000000 7FF002320E2 Microsoft.Practices.EnterpriseLibrary.Caching.ProducerConsumerQueue.Dequeue()(+0xf IL)(+0x18本机)
0c:M 00000000 23A9D330 000007ff00231f7e Microsoft.Practices.EnterpriseLibrary.Caching.BackgroundScheduler.QueueReader()(+0x9 IL)(+0x12本机)
0d:M 00000000 23A9D380 000007fef727c978系统.线程.执行上下文.运行代码(系统.对象)(+0x18 IL)(+0x106本机)
0e:U 00000000 23A9D440 00000 7FEF9001552 MSCorks!CallDescrWorker+0x82
0f:U 00000000 23A9D490 00000 7FEF8E9E5E3 MSCorks!CallDescrWorkerWithHandler+0xd3
10:U 00000000 23A9D530000007 FEF8EAC83F mscorwks!MethodDesc::CallDescr+0x24f
11:U 00000000 23A9D790 00000 7FEF8F0CBD2 MSCorks!在保证清洁度的情况下执行清除器+0x12a
12:U 00000000 23A9DA20 000007 FEF945E572 mscorwks!ReflectionInvocation::ExecuteCodeWithGuarantedCleanup+0x172
13:M 00000000 23A9DC30 000007fef7261722 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object)(+0x60 IL)(+0x51本机)
14:M 00000000 23A9DC80 000007fef72f95fd System.Threading.ThreadHelper.ThreadStart()(+0x8 IL)(+0x2a本机)
15:U 00000000 23A9DCD000000 7FEF9001552 MSCorks!CallDescrWorker+0x82
16:U 00000000 23A9DD20 00000 7FEF8E9E5E3 mscorwks!CallDescrWorkerWithHandler+0xd3
17:U 00000000 23A9DDC000000 7FEF8EAC83F mscorwks!MethodDesc::CallDescr+0x24f
18:U 00000000 23A9E010 00000 7FEF8F9AE8D mscorwks!ThreadNative::KickOffThread\u Worker+0x191
19:U 00000000 23A9E330 000007 FEF8F59374 MSCorks!TypeHandle::GetParent+0x5c
1a:U 00000000 23A9E380 000007 FEF8E52045 MSCorks!SVR::gc_堆::生成_堆_段+0x155
1b:U 00000000 23A9E450 00000 7FEF8F66139 MSCorks!ZapStubPrecode::GetType+0x39
1c:U 00000000 23A9E490 00000 985年2月7日MSCorks!ILCodeStream::GetToken+0x25
1d:U 00000000 23A9E4C0 00000 7FEF8F594E1 MSCorks!线程::DoADCallBack+0x145
1e:U 00000000 23A9E630 000007 FEF8F59399 MSCorks!TypeHandle::GetParent+0x81
1f:U 00000000 23A9E680 00000 7 FEF8E52045 mscorwks!SVR::gc_堆::生成_堆_段+0x155
20:U 00000000 23A9E750000007 FEF8F66139 MSCorks!ZapStubPrecode::GetType+0x39
21:U 00000000 23A9E790 000007 FEF8E20E15 MSCorks!ThreadNative::KickOffThread+0x401
22:U 00000000 23A9E7F000000 7FEF8E20AE7 mscorwks!ThreadNative::KickOffThread+0xd3
23:U 00000000 23A9E8D000000 7FEF814FC mscorwks!线程::intermediateThreadProc+0x78
24:U 00000000 23A9F7A000000000 773CBE3D内核32!BaseThreadInitThunk+0xd
25:U 00000000 23A9F7D000000000 775D6A51 ntdll!RtlUserThreadStart+0x1d

640个线程对性能非常不利。如果他们都在等待什么,那么我敢说,你一定会陷入僵局,他们永远不会退出。如果它们都在运行(而不是等待)。。。嗯,在2核或4核处理器上有600多个线程,没有一个线程能够获得足够的时间片来运行很远!;>

如果您的应用程序设置了一个主线程,该线程在线程句柄上等待线程何时退出,而后台线程陷入循环或处于等待状态,并且从未退出线程进程,那么进程及其所有线程将永远不会退出

检查线程代码,确保每个threadproc都有一个退出threadproc的清晰路径。在后台线程中编写一个无限循环是不好的,因为它假设当进程关闭时线程将被强制终止

如果后台线程代码在循环中旋转,等待事件句柄发出信号,请确保您有某种方法来发出该事件的信号,以便线程可以正常有序地退出。否则,您需要编写后台线程来等待多个事件,并在任何一个事件发出信号时解除阻止。这些事件中的一个可以是后台线程主要感兴趣的活动,另一个可以是关机事件

从您发布的堆栈转储中的内容名称来看,线程似乎正在等待某些内容出现在ProducerConsumerQueue中。调查队列对象的支持方式

     ESP              RetAddr
00:U 0000000023a9cb38 00000000775f72ca ntdll!ZwWaitForMultipleObjects+0xa
01:U 0000000023a9cb40 00000000773cbc03 kernel32!WaitForMultipleObjectsEx+0x10b
02:U 0000000023a9cc50 000007fef8f5f595 mscorwks!WaitForMultipleObjectsEx_SO_TOLERANT+0xc1
03:U 0000000023a9ccf0 000007fef8f59f49 mscorwks!Thread::DoAppropriateAptStateWait+0x41
04:U 0000000023a9cd50 000007fef8e55b99 mscorwks!Thread::DoAppropriateWaitWorker+0x191
05:U 0000000023a9ce50 000007fef8e2efe8 mscorwks!Thread::DoAppropriateWait+0x5c
06:U 0000000023a9cec0 000007fef8f0dc7a mscorwks!CLREvent::WaitEx+0xbe
07:U 0000000023a9cf70 000007fef8fba72e mscorwks!Thread::Block+0x1e
08:U 0000000023a9cfa0 000007fef8e1996d mscorwks!SyncBlock::Wait+0x195
09:U 0000000023a9d0c0 000007fef9463d3f mscorwks!ObjectNative::WaitTimeout+0x12f
0a:M 0000000023a9d290 000007ff002321b3 *** ERROR: Module load completed but symbols could not be loaded for Microsoft.Practices.EnterpriseLibrary.Caching.DLL
Microsoft.Practices.EnterpriseLibrary.Caching.ProducerConsumerQueue.WaitUntilInterrupted()(+0x0 IL)(+0x11 Native)
0b:M 0000000023a9d2d0 000007ff002320e2 Microsoft.Practices.EnterpriseLibrary.Caching.ProducerConsumerQueue.Dequeue()(+0xf IL)(+0x18 Native)
0c:M 0000000023a9d330 000007ff00231f7e Microsoft.Practices.EnterpriseLibrary.Caching.BackgroundScheduler.QueueReader()(+0x9 IL)(+0x12 Native)
0d:M 0000000023a9d380 000007fef727c978 System.Threading.ExecutionContext.runTryCode(System.Object)(+0x18 IL)(+0x106 Native)
0e:U 0000000023a9d440 000007fef9001552 mscorwks!CallDescrWorker+0x82
0f:U 0000000023a9d490 000007fef8e9e5e3 mscorwks!CallDescrWorkerWithHandler+0xd3
10:U 0000000023a9d530 000007fef8eac83f mscorwks!MethodDesc::CallDescr+0x24f
11:U 0000000023a9d790 000007fef8f0cbd2 mscorwks!ExecuteCodeWithGuaranteedCleanupHelper+0x12a
12:U 0000000023a9da20 000007fef945e572 mscorwks!ReflectionInvocation::ExecuteCodeWithGuaranteedCleanup+0x172
13:M 0000000023a9dc30 000007fef7261722 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)(+0x60 IL)(+0x51 Native)
14:M 0000000023a9dc80 000007fef72f95fd System.Threading.ThreadHelper.ThreadStart()(+0x8 IL)(+0x2a Native)
15:U 0000000023a9dcd0 000007fef9001552 mscorwks!CallDescrWorker+0x82
16:U 0000000023a9dd20 000007fef8e9e5e3 mscorwks!CallDescrWorkerWithHandler+0xd3
17:U 0000000023a9ddc0 000007fef8eac83f mscorwks!MethodDesc::CallDescr+0x24f
18:U 0000000023a9e010 000007fef8f9ae8d mscorwks!ThreadNative::KickOffThread_Worker+0x191
19:U 0000000023a9e330 000007fef8f59374 mscorwks!TypeHandle::GetParent+0x5c
1a:U 0000000023a9e380 000007fef8e52045 mscorwks!SVR::gc_heap::make_heap_segment+0x155
1b:U 0000000023a9e450 000007fef8f66139 mscorwks!ZapStubPrecode::GetType+0x39
1c:U 0000000023a9e490 000007fef8e1c985 mscorwks!ILCodeStream::GetToken+0x25
1d:U 0000000023a9e4c0 000007fef8f594e1 mscorwks!Thread::DoADCallBack+0x145
1e:U 0000000023a9e630 000007fef8f59399 mscorwks!TypeHandle::GetParent+0x81
1f:U 0000000023a9e680 000007fef8e52045 mscorwks!SVR::gc_heap::make_heap_segment+0x155
20:U 0000000023a9e750 000007fef8f66139 mscorwks!ZapStubPrecode::GetType+0x39
21:U 0000000023a9e790 000007fef8e20e15 mscorwks!ThreadNative::KickOffThread+0x401
22:U 0000000023a9e7f0 000007fef8e20ae7 mscorwks!ThreadNative::KickOffThread+0xd3
23:U 0000000023a9e8d0 000007fef8f814fc mscorwks!Thread::intermediateThreadProc+0x78
24:U 0000000023a9f7a0 00000000773cbe3d kernel32!BaseThreadInitThunk+0xd
25:U 0000000023a9f7d0 00000000775d6a51 ntdll!RtlUserThreadStart+0x1d