使用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. 两个内存概念物理内存 ...
随机推荐
- SQL Server 启用“锁定内存页”
这次在虚拟机中做了一个模拟器做压力测试,简单模拟了一条20个工位的生产线上生产1000个工件,并向 MES 服务端发起功能请求,保存质量数据和扫码数据到数据库.在测试时发现服务端进程的 CPU 占用有 ...
- Python Boolean类型 判断
and 判断非Boolean类型数据会自动转换类型 "A" and "B" → "B" 因为表达式 A 和 B都为True所以返回 &quo ...
- vs2019 配置 qt6
1.下载qt6 我的目录C:\Qt\6.3.1\msvc2019_64\bin C:\Qt\6.3.1\msvc2019_64\include C:\Qt\6.3.1\msvc2019_64\lib ...
- WSL安装Ubuntu 22.04 (2)
1.安装系统环境 1.1.设置软件包源为国内镜像 参考:Ubuntu更换国内镜像源 - 知乎 1.2.更新系统软件包 sudo apt-get update && sudo apt-g ...
- mysql 排序ROW_NUMBER() RANK() DENSE_RANK()
with 月业绩 as (SELECT 年份,月份, ROUND(sum(总业绩)/100000) 业绩 FROM `myj` group by 年份,月份) select * ,ROW_NUMBER ...
- 6. 基础查(会员信息) - 创建查询Web Api - 配置Table Permission
Power Portal中的Web API可以对门户页面中所有的Microsoft Dataverse实体进行创建.更新和删除操作.我们可以直接使用门户Web API对产品创建新客户.更新联系人或 ...
- 配置环境变量在history中显示时间
1.1.临时显示(断电丢失) 配置变量HISTTIMEFORMAT,加入"%F %T ". 示例: [root@CentOS8 ~]# HISTTIMEFORMAT='%F %T ...
- python pandas库总结-数据分析和操作工具
参考:https://pandas.pydata.org/ Input/output相关函数 pandas.read_excel-将Excel文件读入pandas数据框 支持读取xls, xlsx, ...
- archlinux 源配置 桌面美化 终端美化 常用软件 grub配置
简介 本文讲对archlinux进行一些基础系统的配置.常用安装的安装,美化进行配置,先看一下美化后的效果吧 配置pacman和使用AUR(archlinuxcn源) archlinux采用滚动更新的 ...
- SpringBoot---起步依赖starter
1.简化spring应用的初始搭建和开发过程. springboot程序优点:自动配置.起步依赖(简化依赖配置).辅助功能(内置服务器...) <?xml version="1.0&q ...