使用RAMMap+PoolMon分析Windows内存异常使用问题
由于技术能力有限,文章仅能进行简要分析和说明,如有不对的地方,请指正,谢谢。
1 RAMMap和PoolMon工具简介
RAMMap和PoolMon都是微软Sysinternals的工具,前者可以从使用类型、页列表、进程、文件、优先级,以及物理地址来检查内存的使用情况,但是无法检查尚未提交和分页的进程内存使用情况;后者可以是作为RAMMap的补充,可以检查系统分页和非分页的缓冲池内存使用情况,并且提供了按照驱动程序的角度来查看其内存使用情况。
可以说RAMMap可以详细分析用户模式下进程的内存分配情况,但对于内核模式下的内存分配,还是要使用PoolMon来详细分析。
关于RAMMap的微软介绍:RAMMap - Sysinternals | Microsoft Learn
关于PoolMon的微软介绍:PoolMon - Windows drivers | Microsoft Learn
2 Windows内存分配说明
Windows操作系统使用页来分配和管理内存,并将多个物理内存页组成一片虚拟地址空间,物理内存页是不连续的,而虚拟地址空间是连续的。应用程序正是使用了一片连续的虚拟地址来访问物理内存中不连续的内存页,并且由处理器完成虚拟地址和物理地址之间的转换。
处理器根据不同的应用程序代码在用户模式和内核模式些切换,用户模式运行的是notepad.exe、calc.exe这类应用程序,每个应用程序的虚拟地址空间都是独立的,称为“用户空间”,如果一个应用程序发生故障,其他应用程序和操作系统不受崩溃的影响;内核模式包含了核心系统组件和驱动程序,所有代码共享单个虚拟地址空间,称为“系统空间”,如果内核模式驱动程序发生故障,整个操作系统就会发生故障。
而在系统空间里面,又有两个可以动态分配内存的区域:分页缓冲池和非分页缓冲池,分页缓冲池的内存可以被调出到磁盘(发生swap),但是非分页缓冲池的区域是无法调出到磁盘(无法swap)一直占用着内存。
内核模式下的核心系统组件或者驱动程序可以同时使用分页缓冲池和非分页缓冲池的空间,记住如果使用了对于非分页缓冲区,则是固定在物理内存中,无法swap的。
3 案例分享
有一台Windows Server 2016的服务器,运行在VMware vSphere虚拟化平台上,平台版本为6.7,每间隔1周左右,虚拟机就会出现内存异常增长,且通过操作系统自带的任务管理器、资源管理器均无法找到消耗内存的具体进程信息,并且也使用了杀毒软件进行扫描,没有发现异常程序。
- 虚拟化平台监控到内存异常增长。

- 任务管理器显示消耗最大内存空间的为dwm.exe进程,实际上才占用134252KB。

- 杀毒软件扫描结果,没有发现任何异常信息。

3.1 使用RAMMap分析内存的整体分配情况
RAMMap不需要额外安装,在RAMMap - Sysinternals | Microsoft Learn下载传到服务器上运行即可。
- 解压后在文件夹中找到RAMMap64(64位操作系统),双击打开。

- 发现99%的内存都被分配到了NonPaged Pool

结合前文对Windows内存的分配说明,Nonpaged Pool是属于内核模式下的系统空间,这篇区域的内存基本被操作系统的核心组件和驱动程序所使用,而那就需要使用PoolMon继续分析Nonpaged Pool的具体使用情况。
3.2 使用PoolMon分析非分页缓冲池的使用情况
PoolMon包含在Windows 驱动程序工具包 (WDK)的 \Tools\Other 子目录中,微软并没有提供单独的工具下载,而WDK工具的安装需要联网,服务器又处于内网环境无法访问互联网。后面经过测试,可以找一台可联网的机器安装WDK工具,在WDK安装目录下的\Tools\x64 子目录找到poolmon.exe拷贝出来,例如我安装到了C:\Program Files (x86)\Windows Kits\10\Tools\x64目录下。

接下来就是使用PoolMon分析非分页缓冲池的详细使用情况了:
- 打开cmd,在poolmon.exe所在目录,直接执行
.\poolmon.exe -p -b,可以看到消耗最多内存空间是VFil和VNet。(这里因为显示不全,暂不)
- 检查操作系统补丁情况,发现只有安装操作系统时自带的补丁,未再安装其它更新。

- 检查虚拟化平台的BUG情况,暂未发现直接关联的,但是在一篇KB(https://kb.vmware.com/s/article/2077302)中找到了关联的问题,VFil和VNet可能是VMware Tools的驱动,并且要求升级VMware Tools到10.0.8以上,而虚拟机所安装的VMware Tools版本是12.0.0,故基本可以排除是这个BUG。

我们已经通过PoolMon定位到消耗内存资源的罪魁祸首是vFIL和vNET,由于VMware Tools的版本比KB中说明的版本要高,暂不考虑升级VMware Tools。
由于该问题是可复现的(基本上运行了一周左右就会出现这个情况),沟通处理该问题的解决方案时,采用了排除法:
- 考虑先对操作系统安装最新的补丁。
- 如果操作系统补丁无效,则说明不是由于操作系统自身原因,再考虑升级VMware Tools。
最后通过观察,确认是安装了当时操作系统最新的补丁后解决了这个问题。
总结:工欲利其事,必先利其器。需要对所解决的事情涉及的理论和内容有一定的了解,才能够正确地使用工具来解决问题。
使用RAMMap+PoolMon分析Windows内存异常使用问题的更多相关文章
- 解决Windows内存问题的两个小工具RamMap和VMMap(这个更牛更好)
来源:http://www.cr173.com/html/13006_1.html .net程序内存监测分配工具(CLR Profiler for .NET Framework 4)官方安装版 类型: ...
- 解决Windows内存问题的两个小工具RamMap和VMMap
解决Windows内存问题需要对操作系统的深入理解,同时对于如何运用Windows调试器或性能监控器要有工作认知.如果你正试着得到细节,诸如内核堆栈大小或硬盘内存消耗,你会需要调试器命令和内核数据架构 ...
- 第13章 Windows内存体系结构
13.1 Windows的虚拟地址空间安排 13.1.1虚拟地址空间的分区(即虚拟地址空间布局) 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Window ...
- Windows内存管理和linux内存管理
windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...
- windows内存体系结构 内存查询,读,写(附录源码)
“进程内存管理器”这个程序实现的最基本功能也就是对内存的读写,之前的两篇文章也就是做的一个铺垫,介绍了内核模式切换和IoDeviceControl函数进行的应用程序与驱动程序通信的问题.接下来就进入正 ...
- SysInternals提供了一个工具RamMap,可以查看内存的具体使用情况
SysInternals提供了一个工具RamMap,可以查看内存的具体使用情况.如果发现是Paged Pool和Nonpaged Pool占用过大,可以用另一个工具poolmon来查看占用内存的驱动T ...
- 全面介绍Windows内存管理机制及C++内存分配实例
转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...
- 记录特殊情况的Python脚本的内存异常与处理
问题 Python 脚本使用 requests 模块做 HTTP 请求,验证代理 IP 的可用性,速度等. 设定 HTTP 请求的 connect timeout 与 read response ti ...
- windows内存映射学习及帮助类实现
本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...
- Windows内存管理[转]
本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...
随机推荐
- EXT GridPanel button 按钮 事件 方法 DirectMethod
C# 代码 //首页 Ext.Net.Button btnFirst = new Ext.Net.Button(); btnFirst.Icon = Icon.ControlStartBlue; bt ...
- 穿透式监管与CTP
https://blog.csdn.net/wowotuo/article/details/90454013 代码示例: https://tashaxing.blog.csdn.net/article ...
- 探秘ThreadLocal
一 类结构 主要是set(T), get(), remove()方法 二 TheadLocal是什么时候创建的 threadLocal的初始化, lazy creating, 用到的时候(get 或 ...
- vue +iview Select省市区联动
因为需要保存的表里只有City_id一个字段,所以这边只保存"区"的值 <Row type="flex" justify="start" ...
- 排序方法-c语言
在接触过得排序算法中中,较为常见的有冒泡排序.选择排序.归并排序.快速排序法,他们的区别在于稳定性.时间复杂度.空间复杂度等: 现简单复习一下冒泡排序: 思路非常简单,逐个比较相邻的两个元素,前一个元 ...
- 【Leetcode】 剑指offer:字符串(简单)--Day03
剑指 Offer 05. 替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 逐字符遍历原字符串,遍历过程中对存放结果的字符串分情况更新. class Solu ...
- python requests 上传文件_python3使用requests上传文件,content-type踩的坑
通常提交普通表单时,requests的post方法可以指定headers,所以我在使用requests模拟上传文件行为时,直接按照下面的方式写了: 然后服务器就报出了找不到分隔符Invalid mul ...
- win10,在桌面点击右键:显示设置和个性化,出现“该文件没有与之关联的应用来执行该操作,请安装应用,若已经安装应用,请在默认应用设置页面中创建关联”
参考:https://zhidao.baidu.com/question/2076100681854702028.html 1. WIN + R 打开运行,并输入 regedit,点击确定,进入注册表 ...
- Python笔记--练习题(都来瞧一瞧,看一看嘞)
利用Python对文件进行操作 重新写入的文件如下图所示: 统计学生成绩文件的最高分最低分和平均分 Python如何统计英文文章出现最多的单词 Python统计目录下的文件大小 Python按照文件后 ...
- 11.8 消除闪烁(2)(harib08h)
ps:看书比较急,有错误的地方欢迎指正,不细致的地方我会持续的修改 11.8 消除闪烁(2)(harib08h) 11.7 消除闪烁(1)(harib08g)存在的问题: 鼠标放在计时器上会有 闪烁, ...