【问题标题】:Why does IIS stop after a while?为什么 IIS 会在一段时间后停止?
【发布时间】:2024-05-23 19:10:02
【问题描述】:

我对IIS的生命周期不是太清楚,但我的大致理解是:

  1. IIS 每隔几个小时就会自行重置。这显然是为了解决任何内存泄漏、资源死锁等问题,即。这似乎是一个清理操作。
  2. 每隔几个小时(我想我读了 23 小时),服务器就会停止侦听入站请求并运行 Application_End。外部页面请求将重新启动应用。

我能否对为什么会出现这些行为有更多的推理?特别是关于第 2 项...我的服务器运行的内部调度行为昨晚完全死了。原因是 Application_End 发生并且没有客户请求再次启动 IIS 服务器。这似乎很奇怪。为什么不只是清理内存泄漏等,然后让 IIS 完全按原样运行呢?我能想到的唯一原因是它可以让服务器回收 IIS 使用的内存/cpu,但这似乎很荒谬,并且是错误的原因,例如我的调度程序问题!

【问题讨论】:

  • 已经有了很好的答案。我仍然不清楚的一件事是为什么 IIS7 不会在重启事件发生后立即完全初始化。 IE。为什么我需要等待网页请求来启动我的池,而不是让服务器自动运行并全力以赴地接收客户端 Web 请求?

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


【解决方案1】:

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

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

Performance settings 可以在工作进程空闲指定分钟数或 CPU 达到指定阈值时关闭它。您还可以增加应用程序池的工作进程数量并创建网络花园。

Health settings 监控工作进程,如果它们反复失败,将关闭它们,并检查它们是否在指定时间内启动和停止。

【讨论】:

    【解决方案2】:

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

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

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

      为什么我需要等待网页请求来启动我的池,而不是让服务器自动运行并全力以赴地接收客户端网络请求?

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

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

      【讨论】:

      • Tx,那是缺失的部分!与我自己的专用机器相比,共享环境更有意义。
      【解决方案4】:

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

      【讨论】: