gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:04:13 40 4
gpt4 key购买 nike

我是 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/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com