2011-12-08 43 views
2

我們有一個.NET 3.5 WCF服務,託管在IIS 6.0上,它具有basicHttp綁定。這由2個.NET和2個ASP應用程序使用。當第四個應用程序(不論是.NET還是ASP)啓動並嘗試使用它時,w3wp.exe將在99%處達到峯值,並在幾秒鐘後停留在那裏。當WCF服務被調用時,IIS工作進程(w3wp.exe)發射到99%的CPU

基於此article,我們嘗試將以下內容添加到.NET 2.0 machine.config中,但這沒有任何影響。

<processModel autoConfig="false" maxWorkerThreads="500" maxIoThreads="500" minWorkerThreads="2"/> 
<httpRuntime minFreeThreads="250" minLocalRequestFreeThreads="250"/> 

任何想法?

編輯:增加了碰撞分析報告信息:

警告1:w3wp.exe_ V2.0應用 _PID_ _Date__12_08_2011__Time_12_13_39PM_ _Manual Dump.dmp以下線程等待同步WCF請求執行 4.35%的線程被阻止

請點擊實際線程來查看WCF線程的描述或檢查WCF請求報告以找出線程的實際線程ID等待。有關此WCF行爲的更多詳細信息,請查看有關WCF請求限制和服務器可伸縮性的博客。

Thread 16 - System ID 3920 
Entry point mscorwks!ThreadpoolMgr::intermediateThreadProc 
Create time 12/8/2011 12:10:44 PM 
Time spent in user mode 0 Days 00:00:00.031 
Time spent in kernel mode 0 Days 00:00:00.140 

This thread is waiting on a synchronous WCF request to execute 

The destination WCF Thread for this ASP.NET worker thread is 14 


.NET Call Stack 
Function 
System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle, UInt32, Boolean, Boolean) 
System.Threading.WaitHandle.WaitOne(Int64, Boolean) 
System.Threading.WaitHandle.WaitOne(Int32, Boolean) 
System.Threading.WaitHandle.WaitOne() 
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(System.Web.HttpApplication, Boolean) 
System.ServiceModel.Activation.HttpModule.ProcessRequest(System.Object, System.EventArgs) 
System.Web.HttpApplication+SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef) 
System.Web.HttpApplication+ApplicationStepManager.ResumeSteps(System.Exception) 
System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext, System.AsyncCallback, System.Object) 
System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest) 
System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest) 
System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32) 
+2

要嘗試從您的WCF服務所做的工作中分離出IIS處理,請創建一個Windows服務託管版本的服務,並查看它是否在類似負載下顯示相同的行爲。如果確實如此,則服務中的負載會觸發CPU密集型工作。如果沒有,那麼你知道你有一個IIS優化問題,可以通過移動到IIS 7來解決:) –

+0

@SixtoSaez:這似乎是一個好主意,但將其轉換爲Windows服務(或遷移到IIS 7)將是不切實際的在這個階段考慮它的大小。我希望這可能是關於ASP.NET工作線程與WCF IO線程交談方式的線程管理問題。 – Kash

回答

0

聽起來像你的負載是以某種方式產生大量的線程,從而導致CPU瘋狂地工作,以跟上他們。由於您的編輯引用了崩潰轉儲,因此您可能可以使用WinDbg來查明發生了什麼。

如果你熟悉WinDbg中,並將它已經安裝和配置(otherwise spend some quality time with the tutorials here),請嘗試以下操作:

.loadby sos mscorwks 
.prefer_dml 1 
!threads 

這會顯示有多少線程創建的。 .prefer_dml 1可以生成HTML鏈接,因此您只需單擊即可在輸出中運行相應的命令。下一次運行:

!syncblk 

查看哪些線程可能被阻止。它應該show which thread正在阻止。下次運行像這樣得到堆棧螺紋32,如果一個是罪魁禍首:

~32e!clrstack 

它應該包含在該線程這是做封閉運行的代碼信息。說與WinDbg一起工作非常古怪是一個巨大的輕描淡寫,但它是值得努力來幫助調試像你這樣的問題。祝你好運!

+0

謝謝你的回答。我沒有使用WinDbg(在獲取它的過程中),但是如果它只顯示阻塞線程和它的堆棧跟蹤,不是我在OP中所擁有的。我知道線程16是罪魁禍首,從.NET堆棧跟蹤中,'HostedHttpRequestAsyncResult.ExecuteSynchronous'正在等待IO線程14.我只是不確定IO線程正在做什麼。 WinDbg會在這方面提供幫助嗎? – Kash

+0

我不清楚問題中屬於哪個線程的堆棧跟蹤。如果堆棧跟蹤是針對線程16,那麼它本身等待某個東西(線程14?)。否則,查看線程14的堆棧跟蹤,看看它在做什麼。希望!syncblk輸出應該有助於確定涉及死鎖的任何線程。這是使用WinDbg確實有助於假設你知道要施放哪個咒語的地方。 –

相關問題