由于技术能力有限,文章仅能进行简要分析和说明,如有不对的地方,请指正,谢谢。

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周左右,虚拟机就会出现内存异常增长,且通过操作系统自带的任务管理器、资源管理器均无法找到消耗内存的具体进程信息,并且也使用了杀毒软件进行扫描,没有发现异常程序。

  1. 虚拟化平台监控到内存异常增长。

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

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

3.1 使用RAMMap分析内存的整体分配情况

RAMMap不需要额外安装,在RAMMap - Sysinternals | Microsoft Learn下载传到服务器上运行即可。

  1. 解压后在文件夹中找到RAMMap64(64位操作系统),双击打开。

  2. 发现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分析非分页缓冲池的详细使用情况了:

  1. 打开cmd,在poolmon.exe所在目录,直接执行.\poolmon.exe -p -b,可以看到消耗最多内存空间是VFil和VNet。(这里因为显示不全,暂不)

  2. 检查操作系统补丁情况,发现只有安装操作系统时自带的补丁,未再安装其它更新。

  3. 检查虚拟化平台的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。

由于该问题是可复现的(基本上运行了一周左右就会出现这个情况),沟通处理该问题的解决方案时,采用了排除法:

  1. 考虑先对操作系统安装最新的补丁。
  2. 如果操作系统补丁无效,则说明不是由于操作系统自身原因,再考虑升级VMware Tools。

最后通过观察,确认是安装了当时操作系统最新的补丁后解决了这个问题。

总结:工欲利其事,必先利其器。需要对所解决的事情涉及的理论和内容有一定的了解,才能够正确地使用工具来解决问题。

使用RAMMap+PoolMon分析Windows内存异常使用问题的更多相关文章

  1. 解决Windows内存问题的两个小工具RamMap和VMMap(这个更牛更好)

    来源:http://www.cr173.com/html/13006_1.html .net程序内存监测分配工具(CLR Profiler for .NET Framework 4)官方安装版 类型: ...

  2. 解决Windows内存问题的两个小工具RamMap和VMMap

    解决Windows内存问题需要对操作系统的深入理解,同时对于如何运用Windows调试器或性能监控器要有工作认知.如果你正试着得到细节,诸如内核堆栈大小或硬盘内存消耗,你会需要调试器命令和内核数据架构 ...

  3. 第13章 Windows内存体系结构

    13.1 Windows的虚拟地址空间安排 13.1.1虚拟地址空间的分区(即虚拟地址空间布局) 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Window ...

  4. Windows内存管理和linux内存管理

    windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...

  5. windows内存体系结构 内存查询,读,写(附录源码)

    “进程内存管理器”这个程序实现的最基本功能也就是对内存的读写,之前的两篇文章也就是做的一个铺垫,介绍了内核模式切换和IoDeviceControl函数进行的应用程序与驱动程序通信的问题.接下来就进入正 ...

  6. SysInternals提供了一个工具RamMap,可以查看内存的具体使用情况

    SysInternals提供了一个工具RamMap,可以查看内存的具体使用情况.如果发现是Paged Pool和Nonpaged Pool占用过大,可以用另一个工具poolmon来查看占用内存的驱动T ...

  7. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  8. 记录特殊情况的Python脚本的内存异常与处理

    问题 Python 脚本使用 requests 模块做 HTTP 请求,验证代理 IP 的可用性,速度等. 设定 HTTP 请求的 connect timeout 与 read response ti ...

  9. windows内存映射学习及帮助类实现

    本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...

  10. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

随机推荐

  1. mac 安装go语言以及配置环境变量

    Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 其他版本自己根据系统版本下载,这里只介绍mac下载 一 ...

  2. go语言读取文件的简单使用

    注意:打开文件记得一定要关闭 file, err := os.Open("文件名称") defer file.Close() 一.打开文件 1. file, err := os.O ...

  3. Spring Boot 配置文件加载位置及优先级

    内容摘自http://c.biancheng.net/spring_boot/config-order.html 说明如下: /myBoot:表示 JAR 包所在目录,目录名称自定义: /childD ...

  4. F - Substring of Sorted String

    题目链接 题解(树状数组) 我们维护两个树状数组,一个记录 \(1\sim i\) 中 \(s_i>s_{i+1}\)的数量,即逆序对数量,另一个记录 \(1\sim i\) 中 \(26\) ...

  5. 需求分析之道——需求分析要做什么(C系架构设计法,sishuok)

    需求分析之道--需求分析要做什么. 需求分析是架构师开始做架构设计的第一步,对架构师来讲非常非常的重要.因为需求分析能够告诉我们,到底我们要做什么,架构设计就是为了去完成这件事情而做的. 接下来,我们 ...

  6. Spring--AOP切入点表达式

    AOP工作流程 能够与做代理的那个类匹配得上的话,叫做代理对象,否则为原始对象. (SpringAOP的本质:代理模式) AOP的切入点表达式 切入点表达式描述的标准格式 描述方式一:定位到某某包下的 ...

  7. 141. Linked List Cycle (Easy)

    ps:能力有限,若有错误及纰漏欢迎指正.交流 Linked List Cycle (Easy) https://leetcode.cn/problems/linked-list-cycle/descr ...

  8. https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!

    前言 先说看了一天各种博客让我恶心的地方,恶心死了,发现每个人说的第一次发送的内容,数字证书里面包含啥,都有各种不一样!到了最后忽然想起来直接搜着报文就行了. 比如这个博客LS/SSL 协议详解 (9 ...

  9. 标准C语言32个关键字

    数据类型相关:     内建类型:         char  short  int  long  void  float  double     7     自建类型:         struct ...

  10. Pycharm 搭建 Django 项目

    1. 安装需求 在使用 python 框架 Django 需要注意下面事项 Pycharm 版本是专业版而不是社区版本 Pycharm 配置好了 python 解释器 (一般我们现在用的都是pytho ...