IIS 6 + ASP.NET web服务 – DW20和stackoverflow例外

考虑一个启动正常的ASP.NET SOAP Web服务,但是在接收到第一个命中时就会陷入困境。

请注意,这是部署在testing环境中,但不在PreProd环境中。 两者都是Windows 2003 SP3 + IIS 6 + ASP.NET 3.5。 全部是最新的。

我们看到的行为是:

  • 重新启动网站和应用程序池
  • 应用程序池被configuration为在networking服务下运行。
  • 浏览到.asmx和.wsdl正常响应,如预期。
  • 向Web服务发送一个正常的格式良好的SOAP请求/正常的有效载荷
  • 100%的CPU使用率
  • 5秒后,页面请求/站点返回“服务不可用”
  • 在IIS日志文件(即c:\ windows \ system32 \ logfiles \ W3C-foo)中没有创build条目
  • 应用程序池最终停止

碰到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”

解决这个(可能是独特的)问题:

  • 删除并重新创build所有的应用程序池(可能这是过度的和不必要的)
  • 删除磁盘上的应用程序文件
  • 重新部署和新版本的应用程序
  • 确保所有引用都包含在bin目录中

由于受影响的应用程序不能再做任何事情(例如,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工作进程。 看看这是否有帮助:

http://support.microsoft.com/?id=911816

检查事件查看器中的错误(通常是应用程序日志)。 它在pipe理工具下。

另外,@ markus的好处在于,IIS有很多默认的“每Y次不多于X线程崩溃”,所以如果你碰到这样的错误只需几次,整个应用程序池就会被取消。 再次检查事件查看器。