用poolmon检测内存泄漏



1、 运行环境
        服务器操作系统:Microsoft Windows Server 2003 Enterprise Edition Service Pack 1
        服务器IIS:6.0
        客户端:IE5.5+

2、故障现象:
        客户端无法访问Web服务器,错误信息是"页面无法显示",服务器上检查IIS时未发现停止运行,但就是无法访问(即使是静态页面)。查阅windows 安装目录下的system32\LogFiles\HTTPERR\httperrXXX.log(XXX表示数字)文件,发现多条日志都报 Number_Connections_Refused错误(Number是一个整数如1、2、3等)。重启IIS无法解决问题,都是通过重启电脑解决。

3、网上搜索结果:
        经搜索,原因可能是nonpaged pool memory(非分页池内存)不够。搜索到以下文档:



4、Poolmon监测结果
        使用Poolmon监测后发现IIS所使用的tag占用的非分页内存并没有达到20MB的限制,而一个名为Ddk的tag则是每天都增长若干MB直至整个 nonpaged pool memory达到上限导致IIS拒绝服务。微软提供的pooltag.txt里对Ddk的说明是:Ddk  - <unknown>    - Default for driver allocated memory (user's of ntddk.h)。
        如下表所示,到IIS拒绝服务的时候,nonpaged pool memory已经达到上限110MB,而Ddk tag也已经达到了74MB的数量(一般服务器刚启动的时候Ddk只占用不到1MB)。
        Memory: 3669472K Avail: 2629568K  PageFlts:   214   InRam Krnl:10920K P:146036K
         Commit:1237096K Limit:5618588K Peak:1907340K            Pool N:110360K P:154684K
         System pool information
         Tag      Type      Allocs                         Frees                                Diff          Bytes                             Per Alloc

         Ddk       Nonp    2484310 (  13)         1693491 (  13)                790819   73677496 (     0)          93
          WFC    Nonp  387717051 (1584)   387571218 (21112)     145833   5924760 (-745208)     40
         LSwi     Nonp          1 (   0)                 0 (   0)                               1              2584576 (     0)             2584576
         MmCm Nonp         40 (   0)               10 (   0)                             30            1786400 (     0)             59546
         TCPt     Nonp    7962320 (  77)        7962290 (  77)                30            1456744 (     0)            48558

5、故障诊断
        既然确定了主要是Ddk造成nonpaged pool memory不足,那么下一步就是查找出使用了Ddk的驱动程序。在windows安装目录\system32\drivers目录下使用findstr /s /m /l "Ddk" *.sys可以找出哪些驱动程序里面使用了Ddk。查找到以下结果:

  • WINDOWS\system32\drivers\CpqCiDrv.sys
  • WINDOWS\system32\drivers\CPQCISSE.SYS
  • WINDOWS\system32\drivers\iqvw32.sys
  • WINDOWS\system32\drivers\storport.sys
  • WINDOWS\system32\drivers\tmtdi.sys
  • WINDOWS\system32\drivers\TM_CFW.sys

        从这里还是看不出具体属于哪些程序。我的方法是在注册表里搜索这些sys文件的文件名(去除.sys后缀后的名字),查找出前2个sys文件属于HP的一 个工具软件,后2个文件属于趋势防病毒软件,中间2个没有找到,但是在WINDOWS\ServicePackFiles\i386下找到同名文件,因此 可以认为他们是操作系统的驱动程序。
        找到了这些源头,那么就可以使用排除法(一个个卸载他们)确定到底是哪一个有问题或者是都有问题了(操作系统的那2个驱动卸载不了)。需要注意的是,卸载 之后需要重启电脑才能发现变化,否则nonpaged pool memory仍然会按原来的速度持续增长。还有一个要注意的是,排除掉故障源并重启电脑后nonpaged pool memory会增长一段时间(我这里是一天多,这个增长我认为是正常的,服务器各项应用都起来了并达到饱和状态的时候,消耗的nonpaged pool memory应该会比刚启动的时候多),然后稳定下来,而Ddk则基本不见增长。下面列出稳定下来的时候的poolmon监测结果:
        Memory: 3669472K Avail: 2851396K  PageFlts:   469   InRam Krnl: 2556K P:123992K
         Commit:1130100K Limit:5618588K Peak:1217596K            Pool N:31364K P:125092K
         System pool information
         Tag        Type     Allocs                    Frees                     Diff       Bytes                        Per Alloc

         File        Nonp    4900398 ( 221)   4874531 ( 219)    25867 4022408 (   304)    155
         Ntfr        Nonp      76508 (   0)        35611 (   0)            40897 2618376 (     0)       64
         LSwi     Nonp          1 (   0)              0 (   0)                     1          2584576 (     0)       2584576
         MmCa  Nonp     267906 (   1)        245131 (   4)         22775 2544880 (  -288)    111
         MmCm Nonp         40 (   0)             10 (   0)                  30        1786400 (     0)        59546
         ……

         Ddk        Nonp         19 (   0)              15 (   0)                  4         29680 (     0)             7420



标签: windows

相关文章

评论已关闭