asp.net 为什么IIS会在一段时间后停止?

knpiaxh1  于 5个月前  发布在  .NET
关注(0)|答案(4)|浏览(62)

我对IIS的生命周期不是很清楚,但我的总体理解是:
1.每隔几个小时,IIS就会重置自己。这显然是为了修复任何内存泄漏,资源死锁等。也就是说,这似乎是一个清理操作。
1.每隔几个小时(我想我读的是23小时),服务器就停止监听入站请求并运行Application_End。外部页面请求将重新启动应用程序。
我可以得到更多的理由,为什么这些行为发生?特别是关于第2项.我的服务器运行内部调度行为,昨晚完全死亡。原因是Application_End发生,没有客户请求再次启动IIS服务器。这似乎很奇怪。为什么不只是清理内存泄漏等。然后保持IIS运行完全一样?我能想到的唯一原因是它让服务器回收IIS使用的内存/CPU,但这似乎是荒谬的,也是bug的原因,比如我的调度程序问题!

xmd2e60i

xmd2e60i1#

从技术上讲,IIS不会停止或重置。它是正在回收的应用程序池,以确保您的Web应用程序运行的应用程序域不会因代码中的错误/效率低下,框架中的错误等而停滞不前。
IIS模型实际上对长时间运行的应用程序的健康非常有益。例如Windows服务没有这些好处。如果进程崩溃,它就完成了。但是因为IIS可以测量Web应用程序的各个方面,如响应时间,内存消耗,不活动等,它可以提供在某些情况下重置您的应用程序。它们都是可配置的,但您应该始终努力开发Web应用程序,请求不依赖于先前的请求。
你也不应该依赖于web应用程序中发生的不是直接响应web请求的事情,所以如果你启动了一个后台线程来做一些后台任务,我建议你把它移到一个单独的进程中。(如Windows服务或计划任务)。不过,如果您真的不想这样做,有一个IIS 7 Application Warm-Up Module会定期ping您的Web应用程序,以启动它。
如果您使用的是进程内会话状态,并且重置会导致问题,则可能需要考虑使用基于SQL的会话状态提供程序。
无论如何,您可以在此处阅读有关配置IIS 7应用程序池回收行为的更多信息。http://technet.microsoft.com/en-us/library/cc753179(WS.10).aspx

iyfjxgzm

iyfjxgzm2#

IIS中的每个网站都位于一个应用程序池中,您有三个不同的部分可以影响应用程序池何时关闭其工作进程;回收、性能和健康。当过程停止时,新的工作进程(w3p.exe)首先被创建来处理任何新的请求。任何现有的请求都在旧进程上完成,然后关闭旧进程。Application_Start和Application_End将在每个进程上运行,因此您可以适当地设置和拆除资源。
Recycling settings对工作进程何时回收有最直接的影响,您可以选择在运行特定分钟数后重新启动,每天或在特定时间处理的请求数。在Web场中,使用特定时间可以确保场中的所有服务器不会同时回收。您可以关闭所有这些功能,以便工作进程不会回收,但您在问题中指出,这使得服务器容易受到内存泄漏和线程挂起的影响,这将停止IIS为该应用程序池中的网站提供任何请求。
Performance settings可以在工作进程空闲时间达到指定分钟数或CPU达到指定阈值时关闭工作进程。您还可以增加应用程序池的工作进程数量并创建Web花园。
Health settings监视工作进程,如果它们反复失败,将关闭它们,并检查它们是否在指定时间内启动和停止。

gywdnpxw

gywdnpxw3#

我认为其他海报已经很好地回答了你的主要问题,但我想回答你问题的最后一部分。
为什么不只是清理内存泄漏等,然后保持IIS运行完全一样?我能想到的唯一原因是,它让服务器回收内存/CPU使用的IIS,但这似乎是荒谬的和错误的原因,如我的调度问题!

为什么我需要等待一个网页请求来启动我的池,而不是让服务器自动运行并努力接收客户端的Web请求?
让我们考虑一下下面的场景,如果IIS以这种方式运行,会发生什么情况。(即典型的共享主机环境)每个网站都有自己的应用程序池(w3p.exe)正在运行。假设IIS为每个网站启动了一个工作池,而不管是否已向该网站发出请求,如果你有2000个网站,你只分配了4GB的RAM,基本上什么也不做,操作系统可能会开始吃页面文件,而没有任何真实的需要。
这是可取的吗?我想你会同意答案是否定的。

zengzsys

zengzsys4#

这些行为可以通过更改网站的应用池回收设置来控制。我们的生产网站每天晚上凌晨3点会回收其应用池,但我们的QA环境每天会回收几次。

相关问题