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

C# 如果.NET工作进程崩溃,其他用户会怎么办?,c#,asp.net,process,worker,http-status-code-503,C#,Asp.net,Process,Worker,Http Status Code 503,我对ASP.NETWorker进程如何处理进程的了解严重不足。我希望那里的一些专家能告诉我 如果我使用System.OutOfMemoryException使工作进程崩溃,那么对于由同一进程提供服务的其他用户来说,用户体验会是什么?他们会得到一个空白屏幕吗?503错误 我将尝试与我们实验室的其他人一起测试这个场景,但我想我会把它浮出水面。我将更新我们的结果 更新:我们的结果各不相同。如果我们人为地引发OOM异常(例如,通过将越来越大的PDF加载到内存中),该辅助进程所服务的其他线程将暂时“挂起”

我对ASP.NETWorker进程如何处理进程的了解严重不足。我希望那里的一些专家能告诉我

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

我将尝试与我们实验室的其他人一起测试这个场景,但我想我会把它浮出水面。我将更新我们的结果


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

将启动一个新的工作线程,用户将不知道发生了什么。除非它通过rapid fail()完全关闭,否则如果是内存不足的情况,iis通常只会回收应用程序池。

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将在其位置()启动一个新的工作进程,这意味着web应用程序将继续运行。在失败时没有请求被失败的进程服务的用户将不知道这一点

在这种情况下,客户端接收到的HTTP 500错误与在应用程序错误的情况下客户端接收到的HTTP 500错误是无法区分的,比如说,ASPNET应用程序代码中存在未捕获的异常

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

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

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

W3WP.exe的自动重新启动 IIS有一个自动重启(或“保姆”)功能,通过该功能,例如内存大小、请求数或运行时间。在所有这些情况下,当达到配置的阈值时,IIS将停止并重新启动工作进程。这些主动重启通常不会导致请求中断。当IIS决定需要重新启动工作进程时,它会阻止任何新请求到达要停止的工作进程允许该WP中的任何飞行中事务正常完成。当WP中的所有请求完成时,WP死亡,IIS在其位置上启动一个新的请求。然后,这个新流程立即开始从调度队列接收新请求。这对用户或浏览器都是透明的

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

网络花园 此外-IIS允许在单个服务器上执行多个工作进程,一个关于“网络农场”中单词的游戏。如果已设置web garden,则w3wp.exe实例(失败实例除外)提供的事务将继续不受影响。“未受影响”假定内存不足错误是局部的,而不是系统范围内的问题

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

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


参考文献:

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

但是,如果应用程序使用具有进程内会话状态的会话变量,则当应用程序池重新启动时,所有用户的所有会话变量都将丢失。这可能会也可能不会对用户产生负面影响,这取决于您对会话变量所做的操作。您可以通过切换到StateServer或SQL Server来避免这种情况