转自:http://space.itpub.net/4670/viewspace-351828
poolmon.exe 使用说明: http://support.microsoft.com/kb/177415/en-us/
一次故障解决过程
平台:Window 2003 R2 SP1
故障描述一:客户反映数据库服务器每隔几天时间,客户端就无法连接,提示监听程序无法解析专有服务器进程。
处理步骤一:首先判断是否是由于Oracle的SGA分配过大导致用户无法创建新的连接,检查操作系统得/3GB参数、Oracle的SGA参数和客户端连接数,可以初步排除不是由于SGA分配过大导致的用户无法创建新的连接
故障描述二:在跟踪案例细节时,客户反映故障发生时有时任务管理器都无法打开
处理步骤二:任务管理器无法打开可能是由于病毒引起,但是数据库服务器从来不会安装运行新的软件,而且也安装了瑞星杀毒软件,应该可以排除病毒原因,继续检查系统核心内存,发现系统核心未分页内存数在故障时达到120M,而且启动时仅30M左右,未分页内存120M左右已经到达操作系统的限制了,因此可以断定Oracle无法创建新的连接和任务管理器无法打开的原因都在于此。
处理步骤三:已经确定由于是无法分配未分页内存导致的故障,下一步就应该查找究竟是什么程序持续占用了系统未分页内存。这里使用Windows的poolmon工具来进行监视。
运行poolmon发现三个可以的tag分别是Ddk,Mmcm和r100,这三个tag都占用了较大的未分页内存(10M)。重新启动服务器后,再次运行poolmon观察到Mmcm和r100在启动时就占用了较大的未分页内存,与故障时相比变化不大,可以排除。Ddk在启动时时仅占用600K左右的内存,可以断定Ddk发生了内存泄漏。
处理步骤四:确认Ddk究竟是什么咚咚,这里借鉴了网上同仁的处理经验,在此表示感谢。
检查pooltag.txt看到Ddk - <unknown>- Default for driver allocated memory (user's of ntddk.h)说明Ddk是由驱动程序使用
搜索使用Ddk使用的驱动程序(再次感谢网上同仁提供的思路)
findstr /s /m /l "Ddk" c:/windows/system32/drivers/*.sys 返回四个结果
basetdi.sys ipvw32.sys storport.sys wdf01000.sys其中后三个是Windows自身的驱动,basetdi.sys为瑞星驱动
故障描述三:Windows自身驱动可能性极小因此可以暂时排除,重点放在瑞星驱动上。有了目标后再次跟踪,观察到在晚上当系统空闲时未分页空间的大小基本不会增长,而白天系统繁忙时未分页空间的大小有着明显的增长。
处理步骤五:联想到和瑞星驱动相关的,一个是本地I/O被瑞星影响,一个是网络IO被瑞星影响,而这些都和瑞星实时监控相关。于是停止瑞星实时监控,运行poolmon观察到Ddk的值不再增长,在此确认是由于瑞星引起的内存泄漏。
结果:由于服务器上极少去做操作,运行瑞星实时监控的必要性不大,因此建议用户先停止瑞星实时监控以解决这个问题,然后联系瑞星公司处理
工具poolmon.exe说明(XP下可以用memsnap工具)
1. 使能Tag模式
在使用poolmon之前,你必须使能Tag模式并重新启动服务器。池Tag的特性是将收集和计算的信息通过分配内存的Tag值进行排序。
注:使用Windows 2003服务器不需要使能Tag,它是Windows 2003的默认值
方法一:编辑注册表
在HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager下增加键GlobalFlag值0x00000400(十六进制);
重新启动计算机。
方法二:使用Gflags.exe工具
运行Gflags.exe工具选择Enable Pool Tagging
2. 使用poolmon.exe工具收集信息
使用以下步骤复制和存储Tag信息,以间隔15分钟的方式统计2小时,添加信息到文本中。
1. 运行Windows工具包中的程序poolmon.exe
2. 按P显示未分页池
3. 按B按字节大小排序
4. 每十五分钟保存一次屏幕内容
在数据收集结束后,分析Tag信息看看是否存在分配尺寸持续增长
附:poolmon.exe命令说明:
语法:poolmon [itag][xtag][swtich]
itag:列出匹配Tag名的池,可以使用通配符*和?
xtag:列出不包含Tag名的池,可以使用通配符*和?
swtich:
P- 切换显示未分页或显示已分页或两者都显示
L - 切换是否高亮显示值有变化的行
E- 在数据的底部显示池合计值
H/? - 帮助
Q- 退出
T- 按Tag名排序
A-按分配尺寸排序
F- 按空闲尺寸排序
D- 按分配和空闲的差排序
B- 按使用字节排序
M -按分配字节排序
列说明:
Tag:池分配的4字节Tag
Type:分页或未分页
Allocs:所有分配的计数
():分配列中与上次更新的差异
Frees:所有空闲的计数
():空闲列中与上次更新的差异
Diff:(Allocs - Frees)
Bytes:池消耗的合计字节数
():字节列中与上次更新的差异
Per Alloc:(Bytes/Diff)