内存管理(常见问题 – 适用于Windows Vista之后的版本)

描述 : 内存管理是用来描述Windows是如何处理对虚拟内存和物理内存资源的操作与分配的。

物理内存是指系统上物理RAM和页面文件的总和。 页面文件是系统硬盘上的一个文件,他被操作系统当作物理的RAM来使用。页面文件的行为像RAM,同时应用程序也把他当作RAM来使用,但是由于磁盘吞吐量和延迟方面的性能问题,他的速度一般要比真正的RAM慢。

虚拟内存用来描述可被系统或者应用程序所使用的总的内存地址空间。对于一个32位的操作系统,他的寻址范围就是4GB(4,294,967,296字节)。默认的,这个4GB的地址空间被划分成了2部分,一部分是2GB的内核空间用来给系统内核使用,另一部分的2GB空间则是用来给应用程序使用的,每个应用程序都有他们自己独立的2GB虚拟内存空间。在BCDEdit中启用IncreaseUserVa设置可以改变这个分配的比例。Windows Vista, Windows Server 2008和之前版本的 Windows操作系统的主要区别在于许多主要的内核资源现在都是动态分配的而不是像之前那样静态分配的。这使得系统在对内核资源的分配上更加灵活、按需分配,同时也大大降低了内存使用问题的发生。

实际上真正能够使用的虚拟内存要比理论上的最大值还要稍许少一些;这也是为什么虚拟内存可以比物理内存来的大的原因。

虚拟内存的概念是与已安装的物理内存总量无关的;然而,物理内存的总量会影响到某些用来描述内存的数据结构的大小。如果您想了解更多关于虚拟内存的概念,请参考Windows Server 2008内核地址分布,内存问题解决概要(一)内存问题解决概要(二)。 

对于一个64位系统来说,在用来描述虚拟内存的数据结构上的限制则小的多。如果您想了解更多关于64位系统的内存体系结构,请参考这里

划定问题范围: 如果怀疑某个问题可能和内存管理有关,则可以询问如下的问题:

  1. 您有看到系统有报出虚拟内存不足或者其他内存资源不足的错误吗?
  2. 应用程序是否在使用大量内存时出现崩溃或者挂死。
  3. 系统事件日志中是否有记录与这类内存问题相关的日志项。

如果您在系统日志中看到SRV有报出2019或2020错误,那么通常他们表示系统的分页内存池或者非分页内存池用尽了。

数据收集: 在所有案例中,请先收集MPS Reports或MSDT。对于MPS Reports请选择收集General, Internet and Networking, Business
Networks and Server Components的诊断数据。

此外还可能需要收集如下数据:

 请收集性能监视器的性能日志,并且确保性能日志覆盖了内存问题发生的时间段。性能日志的采样间隔则取决于服务器从正常状态到问题发生时所需要用的时间。请使用下表来决定采样的间隔。 请参考以下步骤在Vista和它之后的操作系统版本上设置性能监视器:

  • 点击开始,在搜索栏里输入perfmon,然偶在程序列表中点击perfmon。如果UAC提示您需要输入一个密码来完成UAC认证,请根据提示完成认证操作。
  • 展开数据收集器集,并单击用户定义。
  • 右键并选择新建->数据收集器集,然后按照向导的要求完成数据收集器集的创建。
  • 需要收集的计数器如下:
      •   
      • Cache / All Counters / All Instances
      •   
      • Memory / All Counters / All Instances
      •   
      • Process / All Counters / All Instances
      •   
      • Processor / All Counters / All Instances
      •   
      • Physical Disk / All Counters / All Instances 

 

问题的发生频率

对应的采样时间

每周发生

14  分钟

每天发生

120  秒

每小时发生

5  秒

 

 

  1. 如果您碰到的是分页池或者非分页池泄漏并最终耗尽的问题,请收集Pool Monitor (PoolMon) 日志,同样的,需要确保收集的时间涵盖问题发生的时段。PoolMon的采样频率也取决于问题发生的频率。请参考下表:

 

问题的发生频率

对应的采样时间

每周发生

1  小时

每天发生

15  分钟

每小时发生

60  秒

 

我们强烈建议同时收集性能监视器(perfmon)和PoolMon的数据,这样可以在他们之间找出一些关联的信息。

  1.  对于这类问题,同样也可能有必要在问题发生时去抓一个完全内存转储。在大多数的情况下我们可以通过键盘来触发一个蓝屏并产生内存转储文件,具体信息请参考使用Ctrl-Scroll产生内存转储文件。如果,您的系统支持iLO,您可以使用NMI来产生内存转储文件,具体信息请参考使用NMI产生内存转储文件。无论使用哪种方式,最重要的是您需要确保您系统盘上页面文件的大小至少比RAM的总量多100MB。

问题排查: 当您收集到了这些数据后,请按照下列步骤来做检查:

  1.  MPS Report的分析
  • 查看系统日志中是否有2019或者2020错误记录。
  • 筛选出一些过时的,较旧的组件,比如设备驱动程序,过滤驱动程序等。

       2. 性能监视器日志的分析

  • 查看是否有进程的内存使用量是保持上升趋势的。从图上来看,这种趋势可能显示为一种斜线或者阶梯状的上升趋势。

 

本文转译自AskPerf的博客文章, 原文链接如下:

https://blogs.technet.com/b/askperf/archive/2009/04/10/prf-memory-management-general-issues-windows-vista.aspx