如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?
服务器部署 网络
原文:如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?作为.Net开发人员,其实对IIS的应用程序池知之甚少,在工作中我也有几次遇到过网站无故打不开的情况,找了半天原因也找不到是怎么造成的,有一次我给网站找了一个程序程序池后发现就能正常访问了,这也让我对辨别是问题产生了好奇和疑问,于是开始找这方面的一些资料,原来IIS的应用程序池一般默认都会自动回收的,默认有29个小时回收一次,…
原文:如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?

作为.Net开发人员,其实对IIS的应用程序池知之甚少,在工作中我也有几次遇到过网站无故打不开的情况,找了半天原因也找不到是怎么造成的,有一次我给网站找了一个程序程序池后发现就能正常访问了,这也让我对辨别是问题产生了好奇和疑问,于是开始找这方面的一些资料,原来IIS的应用程序池一般默认都会自动回收的,默认有29个小时回收一次,所以很多时候因为不是上班时间我们没有遇到过,那么对于互联网web应用,如何在用户毫无感知的情况下回收程序池?(对用户产生最小的影响)

简单理解IIS应用程序池

应用程序池可以看成是装载计算机分配给Web应用程序的内存的容器。

网络上有人这样比喻:如果内存是水,那么应用程序池就是鱼缸,Web应用程序就是鱼缸里的金鱼。多个Web应用程序可以放在同一个应用程序池里面,也就是说一个鱼缸可以养多条金鱼。如果金鱼多了,鱼缸的的空间有限,那么金鱼之间就会争抢生存空间,不是很坚固的鱼缸就会破裂,所有的金鱼(网站)就会受到影响,即内存不足,造成内存溢出的问题。如果时间久了,鱼缸里面的水质就会变差,金鱼就好像生活在臭水沟里,因此我们需要定期换水(回收程序池)。 


程序池自动回收优化

IIS的程序池默认回收间隔是1740分钟(29小时),在自动回收过程中,应用程序池将会清空,保留在内存中的数据将会被清理(相当于IIS重启)。对于互联网应用程序,为了减少数据库服务器的负担,也许会选择将大量数据暂存在内存中,回收会造成内存数据丢失,如果没有及时保存到数据库中,可能导致应用程序出问题。如果遇到系统使用高峰期,回收将可能导致一段时间应用程序无响应(出现假死状态),给予用户一种很不好的体验。 在优化应用程序池之前,我们应用先了解下程序池的几个配置信息:

/upload/image/201908/262571-20170706093737909-2142595668.jpg alt="">

发生配置更改时禁止回收:如果为True,应用程序池在发生配置更改时将不会回收。 
固定时间间隔(分钟):超过设置的时间后,应用程序池回收,为0意味着应用程序池不会按固定间隔回收。 系统默认设置的时间是1740分钟(29小时)。 
禁用重叠回收: 如果为true,将发生应用程序池回收,以便在创建另一个工作进程之前退出现有工作进程。 
请求限制: 应用程序池在回收之前可以处理的最大请求数。如果值为0,则表示应用程序池可以处理的请求数没有限制。 
生成回收事件日志条目: 每发生一次指定的回收事件时便产生一个事件日志条目,里面的明细设置不一一介绍。

问题分析:每1740分钟(29小时)回收一次是否合理?

不太合理,这个周期内,有可能应用程序处于访问高峰期。因为每天的回收时间都是不一样的,很有可能在高峰期回收,就会造成短时间内网站访问出现问题。因此,要避免最大程度的减少对用户的影响,我们需要充分的分析应用程序的访问情况,例如哪个时间段是高峰,哪个时间段访问人数最少。了解到这些后,应用程序部署人员就应该设定固定的回收时间,例如一个网站凌晨两点访问人数是最少的,那么它可以设置“特定回收时间”在凌晨两点,应用程序池里面的特定时间是支持设定多个的,请注意。 

 

 

一、选择每天凌晨2点回收

 /upload/image/201908/262571-20170706093854112-669727099.jpg alt="">


/upload/image/201908/262571-20170706093945409-124018143.png alt="">

 

 

二、每周周六深夜回收

我们推荐采用windows “任务计划程序”配置一个操作系统定时任务执行脚本程序来实现IIS回收,设置方便,也可以灵活调整。 要通过脚本执行IIS的功能,需要在IIS安装配置的时候,勾选上管理工具中的“IIS管理脚本和工具”(见下图)。

/upload/image/201908/262571-20170706094057206-1939707454.png alt="">

用vbs脚本及批处理文件,结合任务计划程序,保证在每周六深夜1点执行IIS回收。

Recyclepool.vbs 文件内容:

appPoolName = WScript.Arguments(0)

Set oWebAdmin = GetObject("winmgmts:rootWebAdministration")

Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='" + appPoolName + "'")

oAppPool.Recycle

set fso=createobject("scripting.filesystemobject")

if (fso.fileexists("d:appPoolrecycleIISPool.log")) then

   '1-forreading,2-forwriting,8-appending

   set file=fso.opentextfile("d:appPoolrecycleIISPool.log",8,ture)

else

   set file=fso.createtextfile( "d:appPoolrecycleIISPool.log",8,ture)

end if

'write(x)写入x个字符,writeline写入换行,writeblanklines(n)写入N个空行

file.writeline  now&" 应用程序池“"&appPoolName &"”已经回收成功。"

file.close

Recyclepool.bat文件内容:

cscript D:appPoolrecyclepool.vbs platweb

 

用vbs脚本及批处理文件,结合任务计划程序,保证在每周六深夜1点执行IIS回收。

/upload/image/201908/262571-20170706094110409-1349077573.png alt="">

成功用windows计划任务解决IIS定时回收问题。