考虑一个启动正常的ASP.NET SOAP Web服务,但是在接收到第一个命中时就会陷入困境。
请注意,这是部署在testing环境中,但不在PreProd环境中。 两者都是Windows 2003 SP3 + IIS 6 + ASP.NET 3.5。 全部是最新的。
我们看到的行为是:
碰到CPU很难的进程是dw20.exe 。 我不确定沃森医生为什么卷入这里。
事件日志显示一个ASP.NET运行时错误: 
任务pipe理器 :

事件日志文本 :

EventType clr20r3,P1 w3wp.exe,P2 6.0.3790.3959,P3 45d6968e,P4 errormanagement,P5 1.0.0.0,P6 4b86a13f,P7 24,P8 0,P9 system.stackoverflowexception,P10 NIL。
问题
任何想什么这个system.stackoverflowexception可能是什么? 鉴于代码在环境之间是相同的,它可能是一个有效载荷的问题? 这可能是一个configuration问题? 您可以在exception消息中看到我的.NET程序集的名称:“ErrorManagement”
解决这个(可能是独特的)问题:
由于受影响的应用程序不能再做任何事情(例如,logging堆栈跟踪),因此应用程序池进程(w3p.exe)被操作系统终止,所以Stackoverflowexception是一种特殊情况。 这就是Watson / DW20博士参与的原因。 你可以试着用SOS扩展来debuggingDW20使用WinDbg保存的转储(如果你不熟悉这个工具集,希望有一个陡峭的学习曲线 – 我希望VS2010按照承诺变得更容易)。
高CPU使用率(通常是高内存使用率)是由DW20引起的,如果“崩溃 – 重启 – 循环”比DW20更快并且因此多个DW20进程累积,这尤其令人讨厌。
默认的IIS应用程序池设置是在短时间内重新启动崩溃的应用程序不超过3次,否则将停止从DoS保护服务器。
关于根本原因,stackoverflow:可能是一切…但这如此疯狂的猜测:数据库访问失败,由于configuration错误,exception生成,并且您的应用程序正在logging数据库exception,没有捕获exception处理exception; )
我有这个问题,发现我有一个LINQ语句试图删除一些行。 它每天都在失败,因此行数不断增加。 这些exception事实上是经过处理的,并logging到了我所做的表格中,所以我在那里find了它。 发现问题表,这是超重行700k +。 我的LINQ看起来像这样:
var db = new DatabaseDataContext(); var updateQueueLogs = db.UpdateQueueLogs; List<UpdateQueueLog> listToDelete; using (new TransactionScope( TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) { listToDelete = (from updateQueueLog in db.UpdateQueueLogs where updateQueueLog.CreatedAt < DateTime.Now.AddDays(-7) select updateQueueLog).ToList(); } updateQueueLogs.DeleteAllOnSubmit(listToDelete); db.SubmitChanges();
所以这是拉动完整的对象,并获得OutofMemory例外。 我改变了这个代码到一个存储过程:
delete from UpdateQueueLogs where CreatedAt < DATEADD(day,-7,getdate())
我只是想发布这个,因为如果你没有看到exception,你可能想要检查一些你的SQL表行数,看看是否有一些LINQ语句超时。
这听起来像你可能会得到一个未处理的exception,从而杀死asp.net工作进程。 看看这是否有帮助:
检查事件查看器中的错误(通常是应用程序日志)。 它在pipe理工具下。
另外,@ markus的好处在于,IIS有很多默认的“每Y次不多于X线程崩溃”,所以如果你碰到这样的错误只需几次,整个应用程序池就会被取消。 再次检查事件查看器。