【问题标题】:IIS7: Faulting application w3wp.exe, what is the root cause of these crashes?IIS7:错误的应用程序 w3wp.exe,这些崩溃的根本原因是什么?
【发布时间】:2011-05-23 22:45:51
【问题描述】:

我们的网站采用 .NET,但其中也包含一些旧的 ASP 和 32 位库。它已经工作了一段时间(2年)。但是在过去的一个月里,我们在 IIS7 服务器上看到了以下错误,我们无法追踪和修复:

“故障应用程序 w3wp.exe,版本 7.0.6001.18000,时间戳 0x47919413,故障模块 kernel32.dll,版本 6.0.6001.18215,时间戳 0x4995344f,异常代码 0xe053534f,故障偏移量 0x0002f328,进程 ID 0x%9,应用程序启动时间 0x%10。”

我们能够重现错误:

  • 我们的一个 .ASPX 页面开始加载、执行代码和查询(我们在整个页面上都有 response.flush() 来跟踪代码中断的位置),然后它突然停止并且我们在IIS。

  • 页面停止加载,并且没有 response.flush(),它不会重定向到我们的 error.aspx 页面(在 web.config 中配置)

  • 错误不会一直发生。有时,它连续发生 3 次,然后在正确重定向到 error.aspx 的情况下不间断地工作 15 分钟。

  • 我们得到的错误是经典的:“BOF 或 EOF 为 True,或者当前记录已被删除。”

  • 当错误发生时,页面挂起,并且来自任何浏览器的同一台计算机上的所有其他会话也会挂起网页(顺便说一句,我们在测试时只允许 1 个工作进程)。从其他计算机上,该站点加载正常。

  • 我可以回收应用程序池,杀死 w3wp.exe,重新启动 IIS。什么都不会。再次成功加载页面的唯一方法是重新启动处理我们的会话状态的 MS SQL。我不知道为什么会这样,但我们猜测用户浏览器上的会话 Cookie 指向一个未正确终止的线程(由于上述崩溃)并且 IIS 正在等待它终止以处理更多代码(? )。如果有人可以更好地解释这一点,那将非常有帮助。我们可以设置一个超时来“终止”线程吗?是 MS SQL 相关问题吗?

我还查看了私有和虚拟内存的使用情况,因为我认为我们的代码不是最有效的,而且我确信我们还有剩余的内存泄漏。然而,我看到页面崩溃了,尽管私有内存和虚拟内存仍然很低(每个都低于 100MB)。

我已经使用了 Debug Diag 和 WinDbg,如下所示:http://blogs.msdn.com/b/tess/archive/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag.aspx,但我们无法让 windbg 工作,这是我们目前正在尝试做的事情。

如果有人可以帮助我们或为我们指明正确的方向,那就太好了,谢谢。

【问题讨论】:

  • 你最好把你遇到的WinDbg问题说清楚。

标签: iis iis-7 application-pool w3wp


【解决方案1】:

这可能是一个边缘情况,但以防万一有人来到这里并且他们使用MVCMailer ,由于邮件中的 .SendAsync() 方法,我遇到了同样的错误。

我将它们全部切换到 .Send() 并且崩溃停止了。

查看this SO answer了解使用邮件异步和避免崩溃的方法(据称,我没有亲自实现)

【讨论】:

    【解决方案2】:

    在 Windows Server 2008R2 机器上安装 Windows 更新后,我们开始收到此错误。 Windows Process Activation Service (WAS) 会安装一些额外的站点绑定,这些绑定会导致我们的设置出现问题。

    我们从我们的网站中删除了 net.tcp、net.pipe、net.msmq 和 msmq.formatname 绑定,并且不再出现错误的应用程序异常。

    【讨论】:

      【解决方案3】:

      “BOF 或 EOF 为 True,或当前记录已被删除”表示表为空,您正在尝试执行 MoveNext。所以在你做任何动作之前检查eof

      IIS 因像这样在 w3wp.exe 中引发内核错误而臭名昭著。会话状态中的所有错误只是崩溃进程的症状。多个 APP 池无济于事——它们只是分散了错误。

      我敢打赌这是由于您的用户环境发生变化而导致的 SQL 死锁。当 SQL 尝试确定要终止哪个查询时,这将导致 10 秒的延迟。一胜一负。失败者取回指向意外空表的指针,您尝试移动并随后崩溃。您也许可以将您的数据库指向一个 ODBC 连接并打开跟踪,或者想办法让 SQL 记录它。

      我在 Perl 中遇到了与上述相同的所有症状。我能够制作一个包装器 fn() 来执行所有 SQL 查询并将所有 sql、+ 参数和任何错误记录到磁盘以跟踪问题。这是死锁,然后我们能够在自动重试中编码,最终我们重新编码查询顺序并扫描列以消除死锁。

      【讨论】:

        【解决方案4】:

        您在某处引用/链接的程序集完全有可能在磁盘上随机损坏(可能发生)。您可以尝试在具有相同统计数据的新机器上复制问题,并全新安装您正在使用的最新 xyz 驱动程序吗?

        我解决了一个神秘的问题,我花了几个月的时间才以这种方式隔离。看起来很干净,具有相同规格和预先要求的驱动程序的新机器可以正常工作 - 只有一些具有相同规格的旧机器始终出现故障。我最终卸载了所有东西(IIS、ASP.NET、.NET、数据库和客户端)并从头开始。我隔离的最终原因是旧机器上的 db 客户端驱动程序损坏(并且所有旧机器都是彼此的克隆,所以我假设它们在损坏发生后被克隆),即使我没有直接调用它,它似乎也弄乱了 .NET 内存空间。我什至还没有用这个答案回复我的"help me debug this monster" 帖子,因为我怀疑它会帮助任何人。

        【讨论】:

        • 非常感谢迈克。我们在 3 个不同的站点有 3 个实现,服务器由不同的主机提供商提供。他们都崩溃了。我们购买了一台新服务器,从头开始重新安装,它以同样的方式崩溃。正如你所建议的,我想知道我们的 MS SQL 或 mySQL 驱动程序是否可能已损坏。您是否也尝试使用 DebugDiag/Windbg 来查明问题的根源?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 2019-02-01
        • 1970-01-01
        相关资源
        最近更新 更多