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

原文出自:http://os.51cto.com/art/201212/375063.htmwindows

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

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

那么,咱们如今就来针对这个问题深刻探讨下,找出问题的根本,争取作到治标治本。工具

首先,确定是分析问题服务器上的IIS日志,我发如今站点没法访问的那段时间, httperr日志中记录了大量的"Connections_Refused"错误性能

 

这个问题是在默认状况下,若是可用的非分页缓冲池内存不足 20MB,Http.sys 服务将中止接收新链接,就会出现上述问题。这也就解释了为何重启IIS没用,只能经过重启Web服务器释放内存资源来解决。操作系统

网上也有微软官方的解决方案:命令行

1. 进入注册表,找到以下项:rest

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters ;日志

2. 新建Dword值,输入名称 "EnableAggressiveMemoryUsage";htm

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只接受链接,但由于某些缘由没有读取数据,而后客户端链接上以后一直发送数据,在这种极端的状况下未分页内存也很快就会被占满。

相关文章
相关标签/搜索