未分页内存泄露
未分页内存泄露导致虚拟机概率性僵死
搜狗高速浏览引起未分页内存泄露导致虚拟机概率性僵死
适用版本(必选)
Null
以XP系统为例。
现象描述(必选)
XP虚拟机经常概率性无法登录,即使虚拟机启动后,不进行任何操作,经过3天左右,无法登录,需要强制重启解决。
告警信息(可选)
该故障无伴随告警产生。
原因分析(必选)
虚拟机经常概率性无法登录,可能是由于系统故障引起,通过查看系统日志,发现有未分页内存不足,是由于操作系统未分页内存泄露一起。
处理过程(必选)
- 通过VNC登录该部分虚拟机,发现虚拟机任务管理器无法打开,在命令行中执行ping命令无法执行;
- 查看系统日志,发现系统日志有srv 1029错误;
- 重启虚拟机后,未分页内存,只有11M左右,监控未分页内存,发现未分页内存一直处于增长状态,如图所示,已经增加至142M。
- 通过XP系统自带的perfmon工具监控进程未分页内存增长,发现并没有进程异常情况;因此,可以断定该问题是由于驱动内存泄露引起。
- 操作方法:
- 开始-运行,输入perfmon后回车,即可打开perfmon.exe。
- 在perfmon.exe的左窗格中,单击“性能日志和警报”,右键,选择,新建“性能计数器”。
- 在计数器的性能对象Process,计数器选择Pool Nonpaged Bytes和Pool Paged Bytes,采样间隔设置为15s
- 观测一段时间后(几个小时或者一天),可以通过 perfmon中的性能监控器,点击“+”,选择之前的日志文件,默认路径:C:\PerfLogs\,查看是哪个进程的未分页内存增长。
- 发现并没有进程异常情况;因此,可以断定该问题是由于驱动内存泄露引起。
- 通过poolmon.exe工具,监控导致未分页内存泄露的应用程序。
- 操作步骤:
- 启用池标记。
在运行之前PoolMon,必须启用池标记,然后重新启动计算机。标记功能池收集,并计算有关内存分配的标记值按排序的池内存统计信息。注意:在Windows Server 2003中池标记是默认启动的,所以不需要手动启用。 Windows XP的计算机中,可以使用编辑注册表或Gflags.exe工具启用池标记,在此只介绍编辑注册表方法。- 运行中,输入regedit,运行注册表编辑器。在注册表中找到下面的项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session管理器,将值更改为0x00000400的十六进制。
- 重新启动虚拟机。
- 注意完毕后调试,请重复以上步骤以禁用pool tagging。
- 使用Poolmon收集信息。Poolmon.exe是在Windows NT 4.0资源工具包和Windows 2000、Windows XP和Windows服务器2003 Cd-rom的\Support\Tools文件夹中可用。Poolmon可显示在命令窗口中的池标记信息。使用箭头键或向上一页和PAGE DOWN键以显示所有工具返回的标记信息。
- 打开Poolmon.exe,按P,按B。其中P表示监控未分页内存,B表示按字节大小排序,其他命令请参考poolmon.exe的帮助。
- 虚拟机刚启动时,未分页内存较小,在处理的问题中,运行一段时间后,可以明显发现Tag为gsmi的程序Nonp持续增长,驱动一般在C:\windows目录下,但是在该目录下为查找到标记为gsmi的驱动,然后通过搜索C:\program files搜索,发现该驱动位于搜狗浏览器安装目录下,标签为gsmi的驱动内存泄露,通过搜索发现该驱动是由“搜狗高速浏览器”。注:应用程序会在系统驱动文件中打上标签,如果打开sogouqosxp.sys文件,可以看到gsmi标记。
- 启用池标记。
- 操作步骤:
-
卸载该浏览器后,gsmi的驱动调用不存在,并且未分页内存处于稳定状态,问题解决。
参考信息(可选)
NonPaged Pool,未分页池,一旦加载到该池就始终驻留在物理内存中。任何进程都可以访问到未分页池,NonPaged在WinXP x86系统中最大只允许256MB(在boot.ini中带/3GB参数启动的OS,NonPaged最大值为128MB)
建议与总结
对于应用程序导致的操作系统未分页内存泄露问题,可以通过微软的perfmon.exe和poolmon.exe工具检测,检测到问题根源后,一定要卸载该应用程序,选择替代品。
Powered By D&J (URL:http://www.cnblogs.com/Areas/)