• 如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?


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

    简单理解IIS应用程序池

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

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

    程序池自动回收优化

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



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

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

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

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

     

    二、每周周六深夜回收

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

    用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:appPool ecycleIISPool.log")) then

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

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

    else

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

    end if

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

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

    file.close

    Recyclepool.bat文件内容:

    cscript D:appPool ecyclepool.vbs platweb

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

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

    文章来源:https://www.cnblogs.com/sky6699/p/7124615.html

  • 相关阅读:
    linux 使用crontab定时任务+shell脚本删除tomcat日志elasticsearch日志索引
    【转】Java8 Stream 流详解
    Mongo查询list数组中一个字段大于特定条数
    安装Elasticsearch出现 node validation exception 的问题处理
    mockito使用教程
    rocketmq4.4配置日志路径等级
    使用ResponseBodyAdvice统一包装响应返回String的时候出现java.lang.ClassCastException: com.xxx.dto.common.ResponseResult cannot be cast to java.lang.String
    服务器22端口连接超时 ssh: connect to host *** port 22: Operation timed out
    【JAVA基础】24 递归练习
    【JAVA基础】23 IO流-其他流
  • 原文地址:https://www.cnblogs.com/yechangzhong-826217795/p/10729238.html
Copyright © 2020-2023  润新知