我对ASP.Net工作流程如何处理流程的知识严重不足。我希望那里的一些专家能帮我填一下。
如果我用System.OutOfMemoryException使工作进程崩溃,那么对于其他被同一个进程服务的用户来说,用户体验会是什么呢?他们会得到一个空白屏幕? 503错误?
我将尝试和我们实验室的其他人一起测试这个场景,但我想我会把它放出来。我将更新我们的结果。
更新:我们的结果各不相同。如果我们人为地导致OOM异常(例如,通过将越来越大的PDF加载到内存中),则由该工作进程服务的其他线程将暂时“挂起”,然后完成,而其他线程似乎永远不会返回。谢谢你的答复。
发布于 2010-03-26 11:01:53
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错误将与客户端在应用程序错误情况下接收到的500错误无法区分,比如ASPNET应用程序代码中的一个未提及的异常。
对于那些处于失败过程中的请求,无法恢复它们。它们将在浏览器上导致500个错误。503服务器繁忙的原因是IIS由于连接数量的阈值而主动拒绝连接。503不是由应用程序失败造成的,所以在内存不足和崩溃的情况下,您不应该期望在飞行中看到503。在一个负载很重的系统上,当进程崩溃和重新启动发生时,您可能会看到503,这是次要的效果。如果这确实是您所看到的,您需要更大的安全裕度来处理单错误情况下的负载。
请求队列
IIS为请求提供了一种方便的方法。。当它们到达网络层(Http.sys)时,它们被放置在队列中,由工作进程来获取。等待由WP处理的IIS队列中的任何请求都将不受影响地继续进行,不过由于资源争用,它们可能会临时增加延迟(服务时间),因为服务器上正在运行的进程减少了一个。在配置正确的系统上,此队列中的等待时间通常非常短。
当此队列已满时,您将看到503个错误。
W3WP.exe的自动重启
IIS有一个自动重新启动(或“保姆”)工具,通过它,它在员工进程超过配置阈值后重新启动。 (如内存大小、请求数量或运行时间)。在所有这些情况下,IIS将在达到配置阈值时停止并重新启动工作进程。这些主动重新启动通常不会导致任何请求的中断。当IIS决定需要重新启动工作进程时,它会阻止任何新的请求到达要停止的WP。现有请求已耗尽。:该WP中的任何在途事务都允许正常完成.当WP中的所有请求都完成时,WP就会消失,IIS就会开始一个新的请求。然后,这个新进程立即开始从调度队列中接收新请求。这对用户或浏览器都是透明的。
我之所以这样说,通常是因为工人的过程在达到临界值的同时,有可能真的生病了。在这种情况下,w3wp.exe可能不会在配置的“静音”超时。中响应IIS,因此IIS最终不得不终止进程,尽管它还没有报告所有在运行中的请求都已经完成。这应该是非常罕见的,因为这是两种截然不同的特殊情况,但确实发生了。在这种情况下,飞行中的请求将再次得到500个错误.
网络花园
同时- IIS允许单个服务器上的多个工作进程。女士称这为“网络花园”。,一部来自“网络农场”的文字剧本。如果您已经设置了一个web花园,则由w3wp.exe实例服务的事务将继续不受影响。然而,“未受影响”假设,内存不足的错误是本地化的,而不是系统范围内的问题。
底线
底线是,没有什么可以代替你自己的测试。配置选项非常广泛--从重新启动阈值到web花园等等。而且,无论是内存、超时、太忙等等,故障模式都是相当复杂和多变的。你会想知道会有什么结果。
ps:这个问答真的属于serverfault.com!
参考资料:
http://blogs.iis.net/thomad/archive/2008/05/07/the-iis-process-model-features.aspx
发布于 2010-03-26 10:45:19
将启动一个新的工作线程,用户不会知道发生了什么。除非它通过快速故障完全关闭(http://technet.microsoft.com/en-us/library/cc779127(WS.10).aspx )
发布于 2010-03-26 10:46:15
如果是内存不足的情况,iis通常只是回收应用程序池。
https://stackoverflow.com/questions/2525790
复制