题 我该怎么做才能确保IIS不回收我的应用程序?


我有一个在IIS中托管的WCF服务应用程序。在启动时,它会获取非常昂贵的(在时间和CPU方面)资源以用作本地缓存。

不幸的是,IIS似乎会定期回收这个过程。因此,我尝试更改应用程序池上的设置,以确保IIS不会回收应用程序。到目前为止,我改变了以下内容:

  • 将CPU下的间隔从5限制为0。
  • 进程模型下的空闲超时从20到0。
  • 回收期间的常规时间间隔从1740到0。

这还够吗?我对我改变的项目有具体的问题:

  1. CPU下限制间隔设置的具体含义是什么?这是否意味着如果超过某个CPU使用率,应用程序池将被回收?
  2. “回收”究竟是什么意思?应用程序是否完全拆除并重新启动?
  3. “工作流程关闭”和“应用程序池回收”之间有什么区别? Process Model下的Idle Time-out文档讨论了关闭worker进程的问题。虽然回收下的常规时间间隔的文档谈论应用程序池回收。我不太清楚两者之间的区别。我认为w3wp.exe是运行应用程序池的工作进程。有人可以解释两者之间的应用差异吗?

拥有IIS7和IIS7.5标签的原因是因为应用程序将同时运行并希望版本之间的答案相同。

图片供参考: enter image description here


70
2017-11-22 23:29




你在哪里获得了IIS的设置截图? - Andrew William Ross


答案:


回收

回收通常是* IIS启动一个新进程作为应用程序的容器,然后将旧进程提供给ShutdownTimeLimit,以便在它被杀之前消除它自己的意志。

* - 通常:请参阅DisallowOverlappingRotation /“禁用重叠循环”设置

它是 有害,原始进程及其所有状态信息都被丢弃。使用进程外会话状态(例如,状态服务器或数据库,如果您的状态很小,甚至是cookie)可以让您解决此问题。

但它是默认的 重叠  - 意味着中断的持续时间被最小化,因为新进程开始并连接到请求队列,然后旧的被告知“你有[ShutdownTimeLimit]秒离开。请遵守。”

设置

对于您的问题:该页面上的所有设置都以某种方式控制回收。 “关闭”可能被描述为“主动回收” - 过程本身决定它的时间,并以有序的方式退出。

反应性回收是WAS检测到问题并射击过程的地方(在建立合适的替代品W3WP之后)。

现在,这里有一些可能导致某种形式再循环的东西:

  • ISAPI认定它不健康
  • 任何模块崩溃
  • 空闲超时
  • cpu限制
  • 调整应用池属性
    • 作为你的妈妈 可以 曾经尖叫过:“停下来 选择 在它,或它永远不会变得更好!“
  • “ping”失败*本身并没有实际ping,因为它使用命名管道 - 更多“生命检测”
  • 上面屏幕截图中的所有设置

该怎么办:

通常:

  • 禁用 闲置超时。 20分钟不活动=热潮!下一个传入请求的新进程。将其设置为零。

  • 禁用 常规时间间隔  - 29小时违约被各方描述为“疯狂”,“烦人”和“聪明”。实际上,其中只有两个是真的。

  • 可选 打开 DisallowRotationOnConfigChange (以上, 禁用Reycling以进行配置更改)如果你只是不能停止玩它 - 这允许你改变任何应用程序池设置,而不会立即发信号通知工作进程它需要被杀死。您需要手动回收应用程序池才能使设置生效,这样您就可以预先设置设置,然后使用更改窗口通过回收过程应用它们。

  • 作为一般原则, 离开 查验 启用。那是你的安全网。我已经看到人们将其关闭,然后网站有时会无限期挂起,导致恐慌......所以,如果设置过于激进而不适合你那么明显非常慢的响应应用,请稍微退一步看看你得到了什么,而不是把它关掉。 (除非您通过自己的监控过程为挂起的W3WP设置了自动崩溃模式转储)

这足以使一个表现良好的过程永远存在。如果它死了,当然,它将被替换。如果它挂起,ping应该选择它并且新的应该在2分钟内启动(默认情况下;最坏情况的计算应该是:最多 ping频率 + ping超时 + 启动时间限制 在请求再次开始工作之前)。

CPU限制不是 一般 有趣的是,因为默认情况下它被关闭了,它也被配置为无论如何都不做任何事情;如果它被配置为终止进程,那肯定是回收触发器。丢开。对于IIS 8.x的注意事项,CPU限制也成为一种选择。

(IIS)AppPool不是(.Net)AppDomain(但可能包含一个/一些)

但是......然后我们进入.Net土地和AppDomain回收,这也可能导致失去状态。 (看到: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/

简短的版本,您可以通过触摸内容文件夹中的web.config文件(再次选择!),或者通过在该文件夹或ASPX文件中创建文件夹,或者......其他东西......这样做 关于 像App Pool一样具有破坏性, 减去本机代码启动成本(它纯粹是托管代码(.Net)概念,所以这里只发生托管代码)。

防病毒软件也可以在扫描web.config文件时触发此操作,从而导致更改通知,从而导致....


92
2017-11-23 05:07





好心检查,

我们为什么要回收我们的应用程序池?

如果您浏览Web以查找应用程序池配置为定期自动回收的原因, 你很难找到一个与记忆问题无关的合理答案。这就像社区一般已经接受了我们的Web应用程序这一事实 (或IIS中托管的服务层)需要回收以避免内存问题。

我一直都认为 如果你的代码需要定期重启以保持正常工作,那么事情显然是错误的。有一个错误 在你的代码中你需要修复它,而不是偶尔重新启动进程以使问题“消失”。

真的需要开始更多地关注 内存管理 在.NET中,并确保我们的应用程序可以保持运行没有问题。


2
2017-11-19 08:03



一个原因是.NET为“大对象”(通常是85K或更大或者其他东西)使用单独的堆,当垃圾收集发生时它们没有被压缩(尽管在.NET 4.5.1中我认为它们增加了压缩LOH的选项),以及在ASP.NET中,当在服务器端呈现HTML时,看到85K的HTML(特别是对于重复的内容,如表格和网格)并不常见,而且这个HTML基本上只是服务器上的一个巨大的String对象,如果它符合条件一个大对象,它导致大对象堆碎片,最终导致OutOfMemoryException,从而回收 - nothingisnecessary


基于OP场景(启动/预热时的长初始化),另一件要检查的事情是 启动时间限制 (秒),默认值为90秒。如果初始化超过启动时间限制,则可以终止工作进程。


0
2017-08-29 07:59