IIS故障(Connections_Refused)问题分析及处理

 更新时间:2012年12月24日 18:02:05   作者:  
这几天某地市Web服务器连续多次出现故障问题(Connections_Refused),正好借这个案例向大家详细介绍下,需要了解的朋友可以参考下

    这篇文章其实已经写好很久,只是后来一直没有重现当时的问题,或者因为业务的重要性、投诉的压力也就临时处理了。这几天某地市Web服务器连续多次出现这个问题,正好借这个案例来做个收尾。

    前几个月有台重要的Web服务器(Windows Server2003 + IIS6.0)出现客户端无法访问Web服务器上的站点,错误信息提示为"页面无法显示"的情况。登录服务器检查后发现IIS并未停止运行,各服务也正常处理,但就是无法访问站点上的页面(包括静态页面)。这种问题其实以前也经常发生,基本上处理方法都是通过重启Web服务器来解决,至于为什么要这样处理,并没有具体的论断和依据,多半是凭借个人的经验所致,所以这种解决方法只能缓解下投诉压力,没有从根本上解决问题。

    那么,我们现在就来针对这个问题深入探讨下,找出问题的根本,争取做到治标治本。

    首先,肯定是分析问题服务器上的IIS日志,我发现在站点无法访问的那段时间, httperr日志中记录了大量的"Connections_Refused"错误

     这个问题是在默认情况下,如果可用的非分页缓冲池内存不足 20MB,Http.sys 服务将停止接收新连接,就会出现上述问题。这也就解释了为什么重启IIS没用,只能通过重启Web服务器释放内存资源来解决。
    网上也有微软官方的解决方案
  1. 进入注册表,找到如下项:
     HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters ; 
  2. 新建Dword值,输入名称 "EnableAggressiveMemoryUsage";
  3. 修改值为1;
  4. 重启 HTTP 服务:
     在DOS下分别执行   
        net stop http /y
        iisreset /restart

    我按照上述说明进行了配置,但有没有效果无法考证,只能先观察这台服务器后续的运行情况。这种处理方法比之前重启Web服务器更进了一步,至少比之前盲目的重启重启重启,更明确的知道了引起问题的原因,离真相更近了一步。那么问题发生的真正原因呢?究竟是什么导致的非分页缓冲池内存会持续增大到少于20M的呢?
    要分析这个问题,首先得了解下Windows系统中的核心内存概念:核心内存是Windows分配给系统内核或驱动所需的内存空间,分页内存是虚拟内存,也就是这一部分内存可以置换到硬盘中,但是,非分页内存是不能置换到硬盘的,只能保存在物理内存中,常用于一些软件或是系统的驱动程序使用。如果未分页内存无限增大,到达一个阀值,就会造成系统问题。在32位的Windows上,这个阀值最高不能超过256MB,否则操作系统会变得非常不稳定。
    打开自己系统的任务管理器,在"性能"项中,可以看到:


     如上图所示,这就是我本机当前时刻所使用的分页和未分页内存数,这个数字很正常。
     我们再来看下最近这台有问题的机器连续2天,2次出现故障时的内存使用数,未分页内存已经不知不觉暴涨到230多M了

      好了,废话不多说,这个时候就需要用到Poolmon这个核心内存泄漏检测工具了。通过这个工具,我们来看看Web服务器上到底是哪些软件或者程序造成内存泄露,从而导致未分页内存数不足的。Poolmon是类似于Dos 的命令行执行程序,基本上完成检测的操作我们只需要2个指令: P-排序标签列表通过分页,非分页,混合等3种模式;B-对标签排序最大字节使用情况。如下图所示:显示的就是操作系统中所有占用非分页内存项,并按字节大小降序排列。我们找出排在前面,并且字节数不断增加的tag项,根据Tag来定位进程和驱动文件。比如我们想看下目前占用90M非分页内存的Thre项,在Dos中输入:
    findstr /s /m /l "Thre" c:\windows\system32\drivers\*.sys

    如上图所示,我们看到是系统驱动和杀毒驱动占用了Thre。这台机器上次中过毒,所以后来下了瑞星和360卫士来排毒。瑞星是出了名的耗未分页内存大户,360卫士本身也已经被病毒感染,所以我基本锁定了这2款软件,先卸载,然后重启服务器,重新下载360卫士和360杀毒再次排毒之后观察服务器运行情况和内存消耗情况。从上次重启到目前为止,运行十多天,未分页内存总消耗保持在50M以内,虽有小许增长,但还算正常。到此,根据上面的分析, 我们就可以定位出导致IIS故障的真正问题所在了。这种问题,很大部分是因为杀毒软件程序或者一些系统驱动导致的。

    这里说的很大部分原因是因为杀毒软件程序或者一些系统驱动导致的非分页内存不足,是因为非分页内存一般是内核程序或驱动程序在请求。这种资源非常宝贵,如果程序处理不当的话,也会导致上述情况,比如一个Socket只接受连接,但因为某些原因没有读取数据,然后客户端连接上之后一直发送数据,在这种极端的情况下未分页内存也很快就会被占满。

相关文章

  • asp.net读取excel文件的三种方法示例

    asp.net读取excel文件的三种方法示例

    这篇文章主要介绍了asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件、引用的com组件读取Excel文件、用文件流读取,需要的朋友可以参考下
    2014-02-02
  • 关于ASP.NET中TreeView用法的一个小例子

    关于ASP.NET中TreeView用法的一个小例子

    下面是一个Treeview动态的绑定3层深度的树的代码,有需要的朋友可以参考一下
    2013-12-12
  • WPF简介与基础开发

    WPF简介与基础开发

    WPF是微软推出的基于Windows的用户界面框架,这篇文章介绍了WPF的基础开发,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • asp.net 动态创建TextBox控件及状态数据如何加载

    asp.net 动态创建TextBox控件及状态数据如何加载

    接着上文Asp.net TextBox的TextChanged事件你真的清楚吗?这里我们来说说状态数据时如何加载的,需要的朋友可以参考下
    2012-12-12
  • ASP.NET使用正则表达式屏蔽垃圾信息

    ASP.NET使用正则表达式屏蔽垃圾信息

    找资料,看看如何实现使用正则表达式屏蔽垃圾信息,找来找去找出来的都不怎么好,有不详细的,有代码缺失的。最后还是找到了微软,先摘过来,大概思路已经有了,只需把下面微软给的样例代码修改一下即可,具体能不能行还不知道,先睡一觉,起来再慢慢研究。
    2008-09-09
  • ASP.NET缓存处理类实例

    ASP.NET缓存处理类实例

    这篇文章主要介绍了ASP.NET缓存处理类,实例分析了asp.net缓存的使用技巧,需要的朋友可以参考下
    2015-06-06
  • ASP.NETWeb服务器验证控件如何使用

    ASP.NETWeb服务器验证控件如何使用

    这篇文章主要介绍了ASP.NETWeb服务器验证控件如何使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • asp.net替换和恢复html特殊字符

    asp.net替换和恢复html特殊字符

    替换html中的特殊字符需要进行替换的文本。替换完的文本。
    2008-05-05
  • 把jQuery的each(callback)方法移植到c#中

    把jQuery的each(callback)方法移植到c#中

    jQuery中使用each(callback)方法可以很方便的遍历集合,如
    2008-03-03
  • Asp.net静态方法之Grid转DataTable方法实现步骤

    Asp.net静态方法之Grid转DataTable方法实现步骤

    GridView绑定DataTable后,如何获取GridView绑定后显示的值,在项目需求的背景下写了一个静态方法,经过在项目中的使用,bug的修复,较为稳定
    2013-04-04

最新评论