我对 ASP.Net 工作进程如何处理进程的了解严重不足。希望有高手可以帮我解答一下。

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

我将尝试与我们实验室的其他一些人一起测试这个场景,但我想我应该把它放在那里。我将更新我们的结果。

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

有帮助吗?

解决方案

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 将此称为“健康监测”),这意味着 Web 应用程序将继续运行。在失败时没有由失败进程提供服务的请求的用户将不会意识到这一点。

在这种情况下,客户端收到的 HTTP 500 错误与客户端在应用程序错误(假设 ASPNET 应用程序代码中存在未捕获的异常)情况下收到的 500 错误没有区别。

对于那些失败过程中的请求,无法恢复它们。它们将导致浏览器出现 500 错误。503 服务器繁忙是由于 IIS 由于连接数阈值而主动拒绝连接而导致的。503 不是由应用程序故障导致的,因此您不应期望在内存不足和崩溃的情况下看到正在进行的事务的 503。在负载较重的系统上,当进程崩溃并重新启动时,您可能会看到 503,这是次要影响。如果这确实是您所看到的,那么您需要更大的安全裕度来处理单一错误条件下的负载。

请求队列

IIS 对请求有一种交接方法. 。当它们到达网络层 (Http.sys) 时,它们被放置在队列中,由工作进程拾取。任何在 IIS 队列中等待 WP 处理的请求将继续不受影响,但由于资源争用,它们可能会看到延迟(服务时间)暂时略有增加,因为服务器上运行的进程减少了。在正确配置的系统上,此队列中的等待时间通常非常非常短。

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

W3WP.exe 自动重新启动

IIS 具有自动重新启动(或“保姆”)功能,通过它 它在超过配置的阈值后重新启动工作进程, ,例如内存大小、请求数或运行时间。在所有这些情况下,当达到配置的阈值时,IIS 将停顿并重新启动工作进程。这些主动重启 通常情况下 不会导致请求的任何中断。当 IIS 决定需要重新启动工作进程时,它会阻止任何新请求到达要停顿的 WP。 现有请求已耗尽: :该 WP 中的任何正在进行的交易都可以正常完成。当 WP 中的所有请求完成后,WP 就会终止,并且 IIS 会在其位置启动一个新的请求。然后,这个新进程立即开始从调度队列中获取新请求。这对于用户或浏览器来说都是透明的。

我说 通常情况下 因为在达到阈值的同时,工作进程可能已经真正生病了。在这种情况下,w3wp.exe 可能无法响应 IIS 配置的“quiesce”超时, ,因此 IIS 必须最终终止该进程,即使它没有报告所有正在进行的请求都已完成。这种情况应该非常罕见,因为这是两种截然不同的异常情况,但它确实发生了。在这种情况下,正在进行的请求将再次出现 500 个错误。

网络花园

另外 - IIS 允许在单个服务器上运行多个工作进程。 MS 称其为“网络花园”, ,一个来自“网络农场”的文字游戏。如果您设置了网络花园,则由 w3wp.exe 实例提供服务的事务(失败的实例除外)将继续不受影响。不过,“不受影响”假设内存不足错误是局部的,而不是系统范围的问题。

底线

最重要的是,没有什么可以替代您自己的测试。配置选项非常广泛——从重启阈值到网络花园等等。此外,故障模式往往非常复杂且多种多样,无论是内存、超时、太忙等等。您会想要了解会发生什么。

附:这个问答确实属于 serverfault.com!


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

其他提示

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

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

至于其他的答案说,在大多数情况下,一切都只是重新启动,谁没有在当时是一个悬而未决的要求大多数用户不会注意到比延迟等等。

但是,如果应用程序使用会话变量与进程内会话状态,所有用户的所有会话变量都将丢失的应用程序池重新启动时。这可能会或可能不会对用户产生负面影响,这取决于你用会话变量做什么。你可以通过切换为StateServer或SQL Server会话存储避免这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top