一个用poolmon查找内存泄露的例子

转自:http://space.itpub.net/4670/viewspace-351828

 

poolmon.exe 使用说明: http://support.microsoft.com/kb/177415/en-us/

一次故障解决过程

   平台:Window 2003 R2 SP1

   故障描述一:客户反映数据库服务器每隔几天时间,客户端就无法连接,提示监听程序无法解析专有服务器进程。

   处理步骤一:首先判断是否是由于OracleSGA分配过大导致用户无法创建新的连接,检查操作系统得/3GB参数、OracleSGA参数和客户端连接数,可以初步排除不是由于SGA分配过大导致的用户无法创建新的连接

   故障描述二:在跟踪案例细节时,客户反映故障发生时有时任务管理器都无法打开

   处理步骤二:任务管理器无法打开可能是由于病毒引起,但是数据库服务器从来不会安装运行新的软件,而且也安装了瑞星杀毒软件,应该可以排除病毒原因,继续检查系统核心内存,发现系统核心未分页内存数在故障时达到120M,而且启动时仅30M左右,未分页内存120M左右已经到达操作系统的限制了,因此可以断定Oracle无法创建新的连接和任务管理器无法打开的原因都在于此。

   处理步骤三:已经确定由于是无法分配未分页内存导致的故障,下一步就应该查找究竟是什么程序持续占用了系统未分页内存。这里使用Windowspoolmon工具来进行监视。

运行poolmon发现三个可以的tag分别是DdkMmcmr100,这三个tag都占用了较大的未分页内存(10M)。重新启动服务器后,再次运行poolmon观察到Mmcmr100在启动时就占用了较大的未分页内存,与故障时相比变化不大,可以排除。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下增加键GlobalFlag0x00000400(十六进制);

重新启动计算机。

方法二:使用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

你可能感兴趣的:(oracle,windows,服务器,工具,数据库服务器,DDK)