iis - Autofac 引起的棘手的 IIS 死锁

标签 iis deadlock autofac

我是 Autofac 用户,现在面临一个非常头痛的问题。电子邮件 Alex 和 Travis 向我提出了这个问题,并得到了他们的答复,在这里,感谢他们的帮助。
为了彻底检查这个问题,我接受了 Travis 的建议,在这里发布了详细信息。

我的邮箱:

We use Autofac 2.6.3.862 in a mvc3 project .

Now we come to the IIS deadlock problem is serious, the server often hanging, we have used the Microsoft Debug Diagnostics Tool to do the analysis (leads to enclose the analysis report ), initially suspected to be a lock in LifetimeScope

I have read your article, but for some technical details are vague to me. Most of our Register() component is SingleInstance, so when Resolve() I doesn't use a a child lifetime scope like using (var scope = Container.BeginLifetimeScope())

, do not know whether this is the reasons of deadlock.



调试诊断分析报告
The following threads in 
w3wp.exe__hg__PID__3904__Date__03_07_2013__Time_11_01_07AM__974__Manual Dump.dmp are waiting to enter a .NET Lock which thread 39 is currently holding    
( 26 34 42 43 44 45 46 47 48 )    
16.67% of threads blocked    

======================================================================================

Detected possible blocking or leaked critical section at 0x0e758a00 owned by thread 26 in w3wp.exe__hg__PID__3904__Date__03_07_2013__Time_11_01_07AM__974__Manual Dump.dmp 

Impact of this lock    
1.85% of threads blocked

(Threads 39)

The following functions are trying to enter this critical section

clr!UnsafeEEEnterCriticalSection+1c    

The following module(s) are involved with this critical section

C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll

======================================================================================

Thread 26 - System ID 7628
Entry point   0x00000000 
Create time   2013/3/7 10:44:15 
Time spent in user mode   0 Days 00:00:00.218 
Time spent in kernel mode   0 Days 00:00:00.343 




This thread is waiting to enter a .NET Lock which thread 39 is currently holding



.NET Call Stack



Function 
System.Threading.Monitor.ReliableEnter(System.Object, Boolean ByRef) 
System.Threading.Monitor.Enter(System.Object, Boolean ByRef) 
Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Container.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.TryResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1, System.Object ByRef) 
Autofac.ResolutionExtensions.ResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext) 
Tunynet.DIContainer.Resolve[[System.__Canon, mscorlib]]() 
Spacebuilder.Common.ProfileRepository..cctor() 
Spacebuilder.Common.ProfileRepository..ctor() 
Spacebuilder.Common.UserProfileService..ctor() 
Spacebuilder.Common.User.get_Profile() 
ASP._Page_Themes_Channel_Default_Views_FindUser__QuickSearch_cshtml.Execute() 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 
System.Web.Mvc.WebViewPage.ExecutePageHierarchy() 
Tunynet.UI.ThemedWebViewPage.ExecutePageHierarchy() 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(System.Web.WebPages.WebPageContext, System.IO.TextWriter, System.Web.WebPages.WebPageRenderingBase) 
Tunynet.UI.ThemedRazorView.RenderView(System.Web.Mvc.ViewContext, System.IO.TextWriter, System.Object) 
System.Web.Mvc.BuildManagerCompiledView.Render(System.Web.Mvc.ViewContext, System.IO.TextWriter) 
System.Web.Mvc.ViewResultBase.ExecuteResult(System.Web.Mvc.ControllerContext) 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(System.Web.Mvc.ControllerContext, System.Web.Mvc.ActionResult) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c.b__19() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(System.Web.Mvc.ControllerContext, System.Collections.Generic.IList`1, System.Web.Mvc.ActionResult) 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(System.Web.Mvc.ControllerContext, System.String) 
System.Web.Mvc.Controller.ExecuteCore() 
System.Web.Mvc.ControllerBase.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.MvcHandler+<>c__DisplayClass6+<>c__DisplayClassb.b__5() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass1.b__0() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass8`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].b__7(System.IAsyncResult) 
System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].End() 
System.Web.Mvc.MvcHandler+<>c__DisplayClasse.b__d() 
System.Web.Mvc.SecurityUtil.b__0(System.Action) 
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(System.Action) 
System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef) 
System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception) 
System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback) 
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 


Full Call Stack



Function   Source 
ntdll!KiFastSystemCallRet    
ntdll!NtWaitForMultipleObjects+c    
KERNELBASE!WaitForMultipleObjectsEx+100    
kernel32!WaitForMultipleObjectsExImplementation+e0    
clr!WaitForMultipleObjectsEx_SO_TOLERANT+56    
clr!Thread::DoAppropriateAptStateWait+4d    
clr!Thread::DoAppropriateWaitWorker+17d    
clr!Thread::DoAppropriateWait+60    
clr!CLREvent::WaitEx+106    
clr!CLREvent::Wait+19    
clr!AwareLock::EnterEpilogHelper+a8    
clr!AwareLock::EnterEpilog+42    
clr!AwareLock::Enter+5f    
clr!AwareLock::Contention+228    
clr!JITutil_MonReliableContention+e8    
System.Threading.Monitor.Enter(System.Object, Boolean ByRef)    
clr!CallDescrWorker+33    
clr!CallDescrWorkerWithHandler+8e    
clr!DispatchCallBody+20    
clr!DispatchCallDebuggerWrapper+75    
clr!DispatchCallNoEH+53    
clr!MethodTable::RunClassInitEx+f1    
clr!MethodTable::DoRunClassInitThrowing+53e    
clr!MethodDesc::DoPrestub+f1    
clr!PreStubWorker+12c    
0x00f80842    
clr!MethodTable::GetRestoredSlot+2a    
clr!MethodDesc::GetMethodEntryPoint+4e    
clr!MethodDesc::DoPrestub+51d    
clr!PreStubWorker+15d    
0x00f80842    
System.Web.WebPages.WebPageBase.ExecutePageHierarchy()    
System.Web.Mvc.WebViewPage.ExecutePageHierarchy()    
System.Collections.Generic.Stack`1[[System.__Canon, mscorlib]].Push(System.__Canon)    
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(System.Web.WebPages.WebPageContext, System.IO.TextWriter, System.Web.WebPages.WebPageRenderingBase)    
System.RuntimeType+ActivatorCacheEntry..ctor(System.Type, System.RuntimeMethodHandleInternal, Boolean)    
System.Web.Mvc.BuildManagerCompiledView.Render(System.Web.Mvc.ViewContext, System.IO.TextWriter)    
System.Web.Mvc.ViewResultBase.ExecuteResult(System.Web.Mvc.ControllerContext)    
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(System.Web.Mvc.ControllerContext, System.Web.Mvc.ActionResult)    
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()    
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1<System.Web.Mvc.ResultExecutedContext>)    
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()    
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()    
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()    
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()    
System.Web.Mvc.ControllerActionInvoker.InvokeAction(System.Web.Mvc.ControllerContext, System.String)    
System.Web.Mvc.Controller.ExecuteCore()    
System.Web.Mvc.ControllerBase.Execute(System.Web.Routing.RequestContext)    
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(System.Web.Routing.RequestContext)    
System.Web.Mvc.MvcHandler+<>c__DisplayClass6+<>c__DisplayClassb.<BeginProcessRequest>b__5()    
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass1.<MakeVoidDelegate>b__0()    
System.Web.Mvc.MvcHandler+<>c__DisplayClasse.<EndProcessRequest>b__d()    
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(System.Action)    
System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult)    
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult)    
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()    
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)    
System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)    
System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)    
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)    
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)    
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)    
webengine4!W3_MGD_HANDLER::ProcessNotification+5b    
webengine4!W3_MGD_HANDLER::DoWork+250    
webengine4!RequestDoWork+2da    
webengine4!CMgdEngHttpModule::OnExecuteRequestHandler+1a    
iiscore!NOTIFICATION_CONTEXT::RequestDoWork+128    
iiscore!NOTIFICATION_CONTEXT::CallModulesInternal+305    
iiscore!NOTIFICATION_CONTEXT::CallModules+28    
iiscore!W3_CONTEXT::DoStateRequestExecuteHandler+36    
iiscore!W3_CONTEXT::DoWork+d7    
iiscore!W3_MAIN_CONTEXT::ContinueNotificationLoop+1f    
iiscore!W3_MAIN_CONTEXT::ProcessIndicateCompletion+1f    
iiscore!W3_CONTEXT::IndicateCompletion+75    
webengine4!W3_MGD_HANDLER::IndicateCompletion+3d    
webengine4!MgdIndicateCompletion+24    
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef)    
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)    
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)    
clr!UM2MThunk_WrapperHelper+10    
clr!UM2MThunk_Wrapper+8c    
clr!Thread::DoADCallBack+f0    
clr!UM2MDoADCallBack+c0    
0x00f98c20    
webengine4!W3_MGD_HANDLER::ProcessNotification+5b    
webengine4!ProcessNotificationCallback+36    
clr!UnManagedPerAppDomainTPCount::DispatchWorkItem+195    
clr!ThreadpoolMgr::NewWorkerThreadStart+20b    
clr!ThreadpoolMgr::WorkerThreadStart+3d1    
clr!Thread::intermediateThreadProc+4b    
kernel32!BaseThreadInitThunk+e    
ntdll!__RtlUserThreadStart+70    
ntdll!_RtlUserThreadStart+1b 


=========================================================================

Thread 39 - System ID 4176
Entry point   0x00000000 
Create time   2013/3/7 10:44:21 
Time spent in user mode   0 Days 00:00:00.140 
Time spent in kernel mode   0 Days 00:00:00.109 




This thread is not fully resolved and may or may not be a problem. Further analysis of these threads may be required.



.NET Call Stack



Function 
Spacebuilder.Common.ProfileRepository..ctor() 
Spacebuilder.Common.UserProfileService..ctor() 
Spacebuilder.Common.UserSearcher..ctor(System.String, System.String, Boolean, Int32) 
Spacebuilder.Environments.Starter.b__54(Autofac.IComponentContext) 
Autofac.RegistrationExtensions+<>c__DisplayClass10`1[[System.__Canon, mscorlib]].b__f(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Builder.RegistrationBuilder+<>c__DisplayClass1`1[[System.__Canon, mscorlib]].b__0(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.Activate(System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.b__0() 
Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(System.Guid, System.Func`1) 
Autofac.Core.Resolving.InstanceLookup.Execute() 
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(Autofac.Core.ISharingLifetimeScope, Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Features.Collections.CollectionRegistrationSource+<>c__DisplayClass4+<>c__DisplayClass6.b__1(Autofac.Core.IComponentRegistration) 
System.Linq.Enumerable+WhereSelectArrayIterator`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext() 
System.Linq.Buffer`1[[System.__Canon, mscorlib]]..ctor(System.Collections.Generic.IEnumerable`1) 
System.Linq.Enumerable.ToArray[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1) 
Autofac.Features.Collections.CollectionRegistrationSource+<>c__DisplayClass4.b__0(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.Activate(System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.Execute() 
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(Autofac.Core.ISharingLifetimeScope, Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.ResolveOperation.Execute(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Container.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.TryResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1, System.Object ByRef) 
Autofac.ResolutionExtensions.ResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext) 
Tunynet.DIContainer.Resolve[[System.__Canon, mscorlib]]() 
Spacebuilder.Search.SearcherFactory.GetSearcher(System.String) 
Spacebuilder.Common.FindUserController._InterestedWithAll(Int32, Int32, System.String) 
DynamicClass.lambda_method(System.Runtime.CompilerServices.Closure, System.Web.Mvc.ControllerBase, System.Object[]) 
System.Web.Mvc.ActionMethodDispatcher.Execute(System.Web.Mvc.ControllerBase, System.Object[]) 
System.Web.Mvc.ReflectedActionDescriptor.Execute(System.Web.Mvc.ControllerContext, System.Collections.Generic.IDictionary`2) 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(System.Web.Mvc.ControllerContext, System.Web.Mvc.ActionDescriptor, System.Collections.Generic.IDictionary`2) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15.b__12() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(System.Web.Mvc.IActionFilter, System.Web.Mvc.ActionExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15+<>c__DisplayClass17.b__14() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(System.Web.Mvc.IActionFilter, System.Web.Mvc.ActionExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15+<>c__DisplayClass17.b__14() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(System.Web.Mvc.IActionFilter, System.Web.Mvc.ActionExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15+<>c__DisplayClass17.b__14() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(System.Web.Mvc.ControllerContext, System.Collections.Generic.IList`1, System.Web.Mvc.ActionDescriptor, System.Collections.Generic.IDictionary`2) 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(System.Web.Mvc.ControllerContext, System.String) 
System.Web.Mvc.Controller.ExecuteCore() 
System.Web.Mvc.ControllerBase.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.MvcHandler+<>c__DisplayClass6+<>c__DisplayClassb.b__5() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass1.b__0() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass8`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].b__7(System.IAsyncResult) 
System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].End() 
System.Web.Mvc.MvcHandler+<>c__DisplayClasse.b__d() 
System.Web.Mvc.SecurityUtil.b__0(System.Action) 
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(System.Action) 
System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef) 
System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception) 
System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback) 
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 


Full Call Stack



Function   Source 
ntdll!KiFastSystemCallRet    
ntdll!NtWaitForSingleObject+c    
ntdll!RtlpWaitOnCriticalSection+13e    
ntdll!RtlEnterCriticalSection+150    
clr!UnsafeEEEnterCriticalSection+1c    
clr!CrstBase::Enter+1ad    
clr!ListLockEntry::FinishDeadlockAwareEnter+25    
clr!ListLockEntry::LockHolder::DeadlockAwareAcquire+28    
clr!MethodTable::DoRunClassInitThrowing+4c2    
clr!MethodDesc::DoPrestub+f1    
clr!PreStubWorker+12c    
0x00f80842    
clr!PreStubWorker+165    
System.Linq.Enumerable+WhereSelectArrayIterator`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext()    
System.Linq.Buffer`1[[System.__Canon, mscorlib]]..ctor(System.Collections.Generic.IEnumerable`1<System.__Canon>)    
System.Linq.Enumerable.ToArray[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1<System.__Canon>)    
System.Collections.Generic.Stack`1[[System.__Canon, mscorlib]].Push(System.__Canon)    
clr!JIT_Stelem_Ref+25    
System.Collections.Generic.Stack`1[[System.__Canon, mscorlib]].Push(System.__Canon) 

亚历克斯回复:

This does sound like a tricky one. What is the DIContainer class doing and do you have any components registered as InstancePerHttpRequest, or InstancePerLifetimeScope? There also seems to be some Quartz jobs in the background too, how are they interacting with the container?



特拉维斯回复:

A very quick look at the stack trace indicates you may have some long-running operations or locks happening in the Spacebuilder.Environments.Starter, Spacebuilder.Common.UserSearcher.ctor, Spacebuilder.UserProfileService.ctor, or Spacebuilder.Common.ProfileRepository. What I'm seeing that's interesting is that during a RESOLVE operation, when whatever component it is gets RESOLVED, there's an internal REGISTER going on. Without seeing the code, I can't tell you what's going on there, but that thread - #39 - that's the stuff I'd look at.

It looks like... A controller action is being invoked There's some sort of lambda running over a closure (DynamicClass.lambda_method) - something custom in your pipeline. SearcherFactory.GetSearcher manually tries to resolve smoething. During the resolution in GetSearcher, something is asking for a collection - like an IEnumerable of services. A constructor parameter? Here's where it gets weird: while resolving that IEnumerable, a new lifetime scope is getting created and something appears to be getting registered in it? The LifetimeScope.ResolveComponent call does do a lock to make sure resolutions are thread-safe. The fact you're getting a deadlock means two different threads are trying to resolve out of the same lifetime scope (the container?) at the same time, which, in MVC, is something to avoid - you probably wouldn't run into this, for example, if you were resolving only out of the HttpRequest lifetime scope since you'd only have that on one thread at a time. Alternatively, you may be passing lifetime scopes around in the app for the purposes of doing service location and that, too, can be a red flag.

There is a wiki page on Concurrency that can also give you some pointers: https://code.google.com/p/autofac/wiki/Concurrency

If that doesn't get you going in the direction you need, I recommend posting to the discussion forum since, again, I'm not really able to provide individual help necessarily in a timely fashion. That will get other eyes on it and may get you help sooner. You'll want to include: A description of the problem (like was in this email) but with more detail about what you expect to happen (e.g., you're accessing a controller action that does blah blah blah). The stack trace of the blocking thread. The code around where things are getting blocked: Your initial ContainerBuilder registrations to show how things are getting registered. What's in those constructors and things that are getting hung. That info will help folks more quickly root out the problem. That's also the stuff you should be looking at with respect to things getting locked



我的补充问题详情:

服务器经常不规律的挂掉,浏览器会突然停止响应,我们用iisreset命令重启服务器。我不确定当时是否调用了 Controller 或触发了某些 Quartz 任务。

在 Application_Start() 中,我们使用 ContainerBuilder.Register() 在同一个根生命周期范围内注册许多组件。而这些组件可能会相互调用。

大多数它们注册为 SingleInstance,例如:
containerBuilder.Register(c => new DefaultCacheService(new MemcachedCache())).As<ICacheService>().SingleInstance();
containerBuilder.Register(c => new QuartzTaskScheduler()).As<ITaskScheduler>().SingleInstance();
containerBuilder.Register(c => new UserService()).As<IUserService>().SingleInstance();
containerBuilder.Register(c => new UserSearcher("~/App_Data/IndexFiles/User")).As<ISearcher>().SingleInstance();
containerBuilder.Register(c => new TagSearcher("~/App_Data/IndexFiles/Tag")).As<ISearcher>().SingleInstance();

只有少数注册为InstancePerHttpRequest,这些组件的初始化与每个请求相关。如:
containerBuilder.Register(c => new FormsAuthenticationService()).As<IAuthenticationService>().InstancePerHttpRequest();

我们提供了一个类(DIContainer),包括一些用于组件解析的简单静态方法。静态方法在解析组件时调用,例如在某些 Controller 、服务、存储库 (DAO) 或 Quartz 任务中。
IContainer container = containerBuilder.Build();
DIContainer.RegisterContainer(container); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

public class DIContainer
{
   private static IContainer _container;

   public static void RegisterContainer(IContainer container)
   {
       _container = container;
   }

   public static TService Resolve<TService>()
   {
       return _container.Resolve<TService>();
   }
   ......
}

我们使用 Lucene.Net 进行全文搜索服务,每个 ISearcher 对应一个搜索类型和一个索引目录。需要时在 SearcherFactory.GetSearcher() 中解析 ISearcher。
public static ISearcher GetSearcher(string IndexPath)
{
   return DIContainer.Resolve<IEnumerable<ISearcher>>().Where(s => s.IndexPath.Equals(IndexPath, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
}

就是这样,但我仍然无法弄清楚根本原因。希望得到您的帮助。

最佳答案

Resolve Method 的内部实现是 LifetimeScope.GetOrCreateAndShare,该方法使用线程锁。查看ProfileRepository的静态构造函数,可能是构造函数的线程锁和autofac的线程锁构成了死锁。

关于iis - Autofac 引起的棘手的 IIS 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15286230/

相关文章:

.net - 为什么我不能将它添加到 machine.config

iis - 如何使用 iis arr 中的基于路径的路由为运行不同 iis 服务器的 2 个应用程序在 IIS 7.0 中配置应用程序请求路由

oracle - 如何识别 Oracle 死锁涉及的行?

sql-server-2008 - 通过使用NOLOCK提示避免死锁

dependency-injection - C# 中的 autofac "Hello World"应用程序 - 初始化

asp.net-mvc-3 - ASP.NET MVC 3 应用程序的扩展?

c# - 以编程方式更改 IIS 网站的 SSL 设置

rest - 解析服务器 SSL IIS

sql - 检查 SQL Server 2005 中的 KEYLOCK

nuget - 为什么在安装autofac时,我的所有web.configs都使用程序集重定向进行更新?