考虑一个 ASP.NET SOAP Web 服务,该服务启动良好,但在收到第一次命中时就很难启动。
请注意,这是在测试环境中进行的部署,而不是在 PreProd 环境中。两者都是 Windows 2003 SP3 + IIS 6 + ASP.NET 3.5。都是最新的。
我们看到的行为是:
- 重新启动站点和应用程序池
- 应用程序池配置为在网络服务下运行。
- 正如预期的那样,浏览到 .asmx 和 .wsdl 会正常响应。
- 向 Web 服务发送一个格式良好的普通 SOAP 请求/普通有效负载
- 100% CPU 使用率
- 5秒后,页面请求/站点返回“服务不可用”
- IIS 日志文件中未创建任何条目(即 c:\windows\system32\logfiles\W3C-foo)
- 应用程序池最终被停止
对 CPU 造成重创的进程是dw20.exe
. 我不确定为什么 Watson 博士会参与其中。
事件日志显示 ASP.NET 运行时错误:
任务管理器:
事件日志文本:
EventType clr20r3、P1 w3wp.exe、P2 6.0.3790.3959、P3 45d6968e、P4 错误管理、P5 1.0.0.0、P6 4b86a13f、P7 24、P8 0、P9 system.stackoverflowexception、P10 NIL。
问题
关于这个 system.stackoverflow 异常可能是什么的任何想法?鉴于环境之间的代码相同,这可能是有效负载问题吗?会不会是配置问题?您可以在异常消息中看到我的 .NET 程序集的名称:“ErrorManagement”
这个(可能是唯一的)问题的解决方案:
Stackoverflow 异常是一种特殊情况,因为受影响的应用程序不能再做任何事情(例如记录堆栈跟踪) - 在这种情况下,应用程序池进程 (w3p.exe) 会被操作系统终止。这就是沃森博士/DW20 参与其中的原因。您可以尝试使用带有 SOS 扩展的 WinDbg 调试 DW20 保存的转储(如果您不熟悉该工具集,预计会出现陡峭的学习曲线 - 我希望使用 VS2010 时这会变得更容易)。
高 CPU 使用率(通常是高内存使用率)是由 DW20 引起的,如果“crash-and-restart-loop”比 DW20 快,因此会累积多个 DW20 进程,这尤其令人讨厌。
默认的 IIS 应用程序池设置是在短时间内重启崩溃的应用程序不超过 3 次,否则它们将被停止以保护服务器免受 DoS 攻击。
关于根本原因,stackoverflow:可能是一切......但是这个疯狂的猜测怎么样:由于配置错误,数据库访问失败,生成异常,并且您的应用程序正在将异常记录到数据库中,而没有在异常处理中捕获异常; )
我遇到了这个问题,发现我有一个 LINQ 语句试图删除一些行。它每天都在失败,所以行数一直在增加。异常实际上已被处理并记录到我创建的表中,因此我在那里找到了它。找到问题表,它是 700k+ 的超重行。我的 LINQ 看起来像这样:
所以它正在提取完整的对象并获得 OutofMemory 异常。我将此代码更改为存储过程:
我只是想发布这个,因为如果您没有看到异常,您可能需要检查一些 SQL 表的行数,看看是否有一些 LINQ 语句超时。
听起来您可能会遇到未处理的异常,这反过来会杀死 asp.net 工作进程。看看这是否有帮助:
http://support.microsoft.com/?id=911816
在事件查看器中检查错误(通常是应用程序日志)。它在管理工具下。
此外,@markus 的优点是 IIS 具有相当硬的默认设置“每 Y 时间不超过 X 个线程崩溃”-设置,因此如果您只点击该页面几次出现此类错误,则整个应用程序池都会被删除. 再次检查事件查看器。