代码之家  ›  专栏  ›  技术社区  ›  Jason Slocomb

如果.NET工作进程崩溃,其他用户会怎么样?

  •  6
  • Jason Slocomb  · 技术社区  · 15 年前

    我对ASP.NET工作进程如何处理进程的知识严重不足。我希望外面的一些专家能帮我补充一下。

    如果我使用System.OutOfMemoryException使工作进程崩溃,那么对于由同一进程提供服务的其他用户来说,用户体验是什么?他们会得到一个空白屏幕吗?503错误?

    我打算和实验室里的其他人一起测试这个场景,但我想我可以把它放在那里。我会更新我们的结果。

    更新 :我们的结果各不相同。如果我们人为地引发oom异常(例如,通过将越来越大的pdf加载到内存中),则由该工作进程提供服务的其他线程将暂时“挂起”,然后完成,而其他线程似乎永远不会返回。谢谢你的回复。

    4 回复  |  直到 15 年前
        1
  •  9
  •   Cheeso    15 年前

    w3wp.exe是进程

    IIS在通用工作进程W3wp.exe中运行所有Web应用程序。无论是用asp.net、isapi还是其他框架编写,为web请求提供服务的进程都是w3wp.exe。在asp.net的情况下,w3wp.exe加载asp.net jit编译的dll并通过它们服务请求。在其他情况下,它的工作方式不同。但关键是w3wp.exe是进程。这个模型从iis6.0开始,在iis7.0中继续。

    意外失败

    如果w3wp.exe由于任何原因意外失败,那么它处理的所有事务都可能得到500个错误(服务器错误)。IIS将在其位置启动新的工作进程( MS calls this "Health Monitoring" ,这意味着web应用将继续运行。在失败时没有请求被失败进程服务的用户将不会意识到这一点。

    在这种情况下,客户机接收到的http 500错误与在应用程序错误的情况下客户机接收到的500错误是不可区分的,比如说aspnet应用程序代码中的一个意外异常。

    对于那些在失败过程中的请求,没有办法恢复它们。它们将导致浏览器出现500个错误。503服务器忙是由于IIS由于连接数的阈值而主动拒绝连接的结果。503不是应用程序失败的结果,因此您不应该期望在内存不足和崩溃情况下看到503是飞行事务。在重负载系统上,您可能会看到503,因为进程崩溃和重新启动是次要的影响。如果这真的是你看到的,你需要一个更大的安全边际来处理单一错误条件下的负载。

    请求队列

    IIS has a hand-off approach for requests . 当它们到达网络层(http.sys)时,它们被放置在一个队列中,由一个工作进程接收。在IIS队列中等待由wp处理的任何请求将继续不受影响,尽管由于资源争用,它们可能会看到延迟(服务时间)略有临时增加,因为服务器上正在运行的进程减少了一个。在配置正确的系统上,此队列中的等待时间通常非常短。

    当此队列已满时,您将看到503个错误。

    自动重新启动w3wp.exe

    iis有一个自动重启(或“保姆”)设施,通过它 it restarts worker processes after they have exceeded configured thresholds ,例如内存大小、请求数或运行时间。在所有这些情况下,当达到配置的阈值时,IIS将停止并重新启动工作进程。这些主动重启 正常地 不要导致任何请求中断。当iis决定需要重新启动工作进程时,它会阻止任何新请求到达该工作进程以使wp静止。 Existing requests are drained :允许该工作包中的任何飞行中事务正常完成。当wp中的所有请求完成时,wp将终止,iis将在其位置启动一个新的请求。然后,这个新流程立即开始从调度队列中提取新请求。这对用户或浏览器都是透明的。

    我说 正常地 因为在达到阈值的同时,工作进程可能已经真正生病了。在这种情况下,w3wp.exe可能在 the configured "quiesce" timeout ,因此,即使iis尚未报告其所有在飞请求都已完成,它也必须最终终止该进程。这应该是非常罕见的,因为这是两个截然不同的例外情况,但它确实发生了。在这种情况下,飞行中的请求将再次得到500个错误。

    网络花园

    同时-IIS允许在一台服务器上有多个工作进程。 MS calls this a "web garden" 一部关于“网络农场”的剧本。如果设置了Web Garden,则由W3wp.exe实例(而不是失败的实例)提供服务的事务将继续不受影响。”“未受影响”假设内存不足错误是本地化的,而不是系统范围的问题。

    底线

    归根结底,没有什么可以替代你自己的测试。配置选项非常广泛——从重启阈值到web花园等等。此外,无论是内存、超时、太忙等等,故障模式往往都相当复杂和多变。你会想知道会发生什么。

    PS:这个问答真的属于serverfault.com!!


    参考文献:
    http://blogs.iis.net/thomad/archive/2008/05/07/the-iis-process-model-features.aspx

        2
  •  0
  •   Raj Kaimal    15 年前

    将启动一个新的工作线程,用户将不知道发生了什么。除非它通过快速故障完全关闭( http://technet.microsoft.com/en-us/library/cc779127(WS.10).aspx )

        3
  •  0
  •   Pierreten    15 年前

    如果是内存不足的情况,IIS通常只回收应用程序池。

        4
  •  0
  •   Joel Mueller    15 年前

    正如其他答案所说,在大多数情况下,一切都只是重新启动,而当时没有挂起请求的大多数用户只会注意到一个延迟。

    但是,如果应用程序将会话变量与in-proc会话状态一起使用,则当应用程序池重新启动时,所有用户的所有会话变量都将丢失。这可能会或可能不会对用户产生负面影响,这取决于您对会话变量所做的操作。可以通过切换到StateServer或SQL Server会话存储来避免此问题。