用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(非分页池内存)不够。搜索到以下文档:
- 一个诊断具体原因的方法:http://jackyhawk.blog.hexun.com/9608276_d.html ,该方法使用了安装盘内Support.cab里面的Poolmon.exe,可直接将Support.cab里面的Poolmon.exe解压出来执行
- Poolmon的使用说明:http://support.microsoft.com/?id=177415
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
评论已关闭