我对IIS的生命周期不是太清楚,但我大致的理解是:
- IIS 每隔几个小时就会自行重置。这样做显然是为了解决任何内存泄漏、资源死锁等问题。这似乎是一个清理操作。
- 每隔几个小时(我想我读了 23 小时),服务器就会停止监听入站请求并运行 Application_End。外部页面请求将重启应用。
我能否对这些行为发生的原因进行更多推理?特别是关于第 2 项……我的服务器运行的内部调度行为昨晚完全消失了。原因是 Application_End 发生并且没有客户请求再次启动 IIS 服务器。这看起来很奇怪。为什么不只是清理内存泄漏等,然后让 IIS 保持原样运行呢?我能想到的唯一原因是它让服务器回收 IIS 使用的内存/cpu,但这似乎是荒谬的,并且是错误的原因,例如我的调度程序问题!
最佳答案
IIS 中的每个网站都位于一个应用程序池中,您有三个不同的部分会影响应用程序池何时回收其工作进程;回收、性能和健康。当进程回收时,首先创建一个新的工作进程 (w3p.exe) 来处理任何新请求。任何现有请求都在旧流程上完成,然后关闭。 Application_Start 和 Application_End 将在每个进程上运行,因此您可以适本地设置和拆卸资源。
Recycling settings对工作进程何时回收有最直接的影响,您可以选择在运行特定的分钟数、处理的请求数或每天的特定时间后重新启动。在网络场中使用特定时间可以确保您永远不会同时回收场中的所有服务器。您可以关闭所有这些,这样您的工作进程就不会回收,但正如您在问题中所述,这会使服务器容易受到内存泄漏和线程挂起的影响,这将停止 IIS 为该应用程序池中的网站提供任何请求。
Performance settings如果工作进程已空闲指定的分钟数或 CPU 达到指定的阈值,则可以关闭该工作进程。您还可以增加应用程序池的工作进程数并创建网络园。
Health settings监控工作进程,如果它们反复失败,将关闭它们,并检查它们是否在指定时间内启动和停止。
关于c# - 为什么 IIS 会在一段时间后停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4840641/