调用WCF服务时,IIS工作进程(w3wp.exe)将射击到99%的CPU

时间:2011-12-08 19:18:32

标签: .net wcf iis-6

我们在IIS 6.0上托管了.NET 3.5 WCF服务,该服务具有basicHttp绑定。这由2个.NET和2个ASP应用程序使用。当第4个应用程序(无论是.NET还是ASP)启动并尝试使用它时,w3wp.exe达到峰值99%并在几秒钟后停留在那里。

基于此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_ 2856 _Date__12_08_2011__Time_12_13_39PM_ 876 _Manual Dump.dmp中的以下主题正在等待同步WCF请求执行 4.35%的线程被阻止

请单击实际线程以查看design WCF线程或检查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) 

1 个答案:

答案 0 :(得分: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非常古怪是一个巨大的轻描淡写,但值得努力帮助调试像你这样的问题。祝你好运!