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

时间:2011-01-30 01:43:32

标签: c# asp.net performance iis-7

我对IIS生命周期并不太清楚,但我的一般理解是:

  1. 每隔几个小时IIS就会自行重置。这显然是为了修复任何内存泄漏,资源死锁等等。这似乎是一次清理行动。
  2. 每隔几个小时(我想我读了23个小时)服务器就会停止监听入站请求并运行Application_End。外部页面请求将重新启动应用程序。
  3. 我可以更多地推理出现这些行为的原因吗?特别是关于项目#2 ...我的服务器运行内部调度行为,昨晚完全死亡。原因是Application_End发生并且没有客户请求再次启动IIS服务器。这看起来很怪异。为什么不只是清理内存泄漏等,然后让IIS保持原样运行?我能想到的唯一原因是它让服务器回收IIS使用的内存/ cpu,但这似乎是荒谬的,也是错误的原因,比如我的调度程序问题!

4 个答案:

答案 0 :(得分:4)

可以通过更改网站的应用池回收设置来控制这些行为。我们的工作生产网站每天凌晨3点回收游泳池,但我们的质量保证环境每天都会循环使用几次。

答案 1 :(得分:4)

IIS中的每个网站都位于应用程序池中,您有三个不同的部分,这些部分会影响应用程序池何时回收它的工作进程;回收,性能和健康。当进程回收时,首先创建一个新的工作进程(w3p.exe)来处理任何新请求。任何现有请求都将在旧流程上完成,然后再关闭。 Application_Start和Application_End将在每个进程上运行,因此您可以适当地设置和拆除资源。

Recycling settings对工作进程何时回收具有最直接的影响,您可以选择在运行特定分钟数,处理的请求数或每天特定时间后重新启动。在使用特定时间的Web场中,可以确保您永远不会同时在服务器场中回收所有服务器。您可以关闭所有这些,以便您的工作进程不会回收,但正如您在问题中所述,这使服务器容易受到内存泄漏和线程挂起的影响,这将阻止IIS为该应用程序池中的网站提供任何请求。

如果工作进程已空闲指定的分钟数或CPU达到指定的阈值,Performance settings可以关闭工作进程。您还可以增加应用程序池的工作进程数并创建Web园。

Health settings监视工作程序处理并在重复失败时将其关闭,并检查它们是否在指定时间内启动和停止。

答案 2 :(得分:3)

从技术上讲,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

答案 3 :(得分:0)

我认为其他海报已经很好地回答了你的主要问题,但是我想谈谈你问题的最后部分。

  

为什么不直接清理内存泄漏等,然后让IIS保持原样运行?我能想到的唯一原因是它让服务器回收IIS使用的内存/ cpu,但这似乎是荒谬的,也是错误的原因,比如我的调度程序问题!

  

为什么我需要等待网页请求启动我的池,而不是让服务器自动运行并且关于接收客户端Web请求呢?

让我们考虑以下场景以及如果IIS以这种方式运行会发生什么。如果我们有一台托管数千个网站的机器(即典型的共享托管环境),每个网站都有自己的应用程序池(w3p.exe)运行。假设IIS为每个网站启动了一个工作池,无论是否对该网站发出了请求,您都会有几千个进程在每次空闲时启动,例如2MB RAM。如果你有2000个网站,你刚刚分配了4GB的RAM,基本上什么都不做,操作系统可能会开始进入页面文件而没有任何实际需要。

这是可取的吗?我认为你同意答案是否定的。