【发布时间】:2011-04-17 14:47:49
【问题描述】:
我有一个用 .net-3.5 编写的大型服务器进程,即在 VMWare vCenter Server 中运行,它不断崩溃而没有报告任何错误。该进程由 32 位 Windows Server 2003 上的 Windows 服务创建,旨在成为一个长时间运行的进程(多天)。这是一个协作过程,通过 Tcp 套接字接受来自运行在其他 Windows XP 机器上的多个客户端的连接,并允许它们共享数据。此外,该进程还自托管了大约 8 个 WCF 服务,这些服务公开了混合的 Tcp 和 Http 端点。该进程通常消耗大约 500 Mb 的内存和 30-50% 的 CPU。在托管 6 个数据库的同一 VM 上还有一个 SQL Server 2005 实例,消耗大约 1-1.2 Gb 的内存。整个系统已分配 8 Gb 的内存,在正常运行期间消耗多达 7 Gb。我假设启用了 PAE 以允许系统寻址 8 Gb 的 ram,但尚未确认这一点。
问题在于,在看似随机的时间,进程会突然崩溃而没有报告任何错误,包括在事件日志中。我已经尝试将调试器附加到进程中,但他们也没有发现崩溃。我首先在加载了符号的发布版本上尝试了 WinDbg,然后我用调试版本替换了所有发布 dll/exe 并加载了它们的符号。崩溃仍然发生,调试器没有捕捉到它们。接下来,我使用 .Net Reflector 插件在系统上安装了 Visual Studio,并附加了它。它也没有捕捉到崩溃。
在你告诉我为什么我们要在单个 VM 上运行这么多东西之前,请知道我没有设计系统,也没有以这种方式实现它。我们的客户出于特定原因要求它,我被要求进入并使其发挥作用。如果您可以找到有助于解释突然崩溃的具体证据,我只会对环境的批评感兴趣。如果我们能够提供此类证据,我们的客户可能愿意改变环境。任何可以让我捕获有关崩溃的更多信息的其他调试技术也将不胜感激。
【问题讨论】:
-
我会首先在应用程序中包含过多的日志记录(例如 NLOG 或 LOG4NET),并查看在发生异常时记录了什么。
-
ru 使用任何非托管第三方库?当您附加 windbg 并且未捕获异常时,windbg 输出中是否还有其他感兴趣的内容?
-
嗯,我的第一个猜测(这就是 all)是某种内存不足错误。您的进程可能正在消耗大量 RAM,您遇到了某种垃圾收集问题,并且该进程正在终止。不知道为什么你不能用调试器捕捉到错误。检查以确保您没有泄漏内存或句柄。当事情稳定时,像 Process Monitor 这样的东西会告诉你什么?
-
我们有过多的日志记录 (Nlog),并且在进程崩溃时没有看到任何异常记录。我们还使用了一些非托管的 3rd 方库。调试器输出中没有任何有趣的内容。
-
这是我们一直在观察的一些有趣的事情。即使进程和父服务作为另一个用户帐户运行,至少有 3 次,我们观察到,如果我登录服务器(存档日志、重新启动服务等),当我注销进程时在同一时刻坠毁。它不会一直发生,但足以让我认为发生了一些事情。同样,该进程由 Windows 服务创建,并在其自己的专用用户帐户(不是我的)下运行。
标签: .net-3.5 crash windows-server-2003 vmware windbg