内存管理(常见问题 – 适用于Windows Vista之前的版本)
内存管理(常见问题 - 适用于Windows Vista之前的版本)
描述 : 内存管理是用来描述Windows是如何处理对虚拟内存和物理内存资源的操作与分配的。
物理内存是指系统上物理RAM和页面文件的总和。 页面文件是系统硬盘上的一个文件,他被操作系统当作物理的RAM来使用。页面文件的行为像RAM,同时应用程序也把他当作RAM来使用,但是由于磁盘吞吐量和延迟方面的性能问题,他的速度一般要比真正的RAM慢。
虚拟内存用来描述可被系统或者应用程序所使用的总的内存地址空间。对于一个32位的操作系统,他的寻址范围就是4GB(4,294,967,296
字节)。默认的,这个4GB的地址空间被划分成了2部分,一部分是2GB的内核空间用来给系统内核使用,另一部分的2GB空间则是用来给应用程序使用的,每个应用程序都有他们自己独立的2GB虚拟内存空间。使用4GB RAM Tuning (/3GB 开关) 或者USERVA开关可以改变他们的分配比例。
虚拟内存的概念是与已安装的物理内存总量无关的;然而,物理内存的总量会影响到某些用来描述内存的数据结构的大小。如果您想了解更多关于虚拟内存的概念,请参考内存管理-x86虚拟地址空间,内存问题解决概要(一)和 内存问题解决概要(二)。
对于一个64位系统来说,在用来描述虚拟内存的数据结构上的限制则小的多。如果您想了解更多关于64位系统的内存体系结构,请参考这里。
划定问题范围: 如果怀疑某个问题可能和内存管理有关,则可以询问如下的问题:
- 您有看到系统有报出虚拟内存不足或者其他内存资源不足的错误吗?
- 应用程序是否在使用大量内存时出现崩溃或者挂死。
- 系统事件日志中是否有记录与这类内存问题相关的日志项。
如果您在系统日志中看到SRV有报出2019或2020错误,那么通常他们表示系统的分页内存池或者非分页内存池用尽了。
数据收集: 在所有案例中,请先收集MPS Reports或MSDT。对于MPS Reports请选择收集General, Internet and Networking, Business Networks and Server Components的诊断数据。
此外还可能需要收集如下数据:
1. 请收集性能监视器的性能日志,并且确保性能日志覆盖了内存问题发生的时间段。性能日志的采样间隔则取决于服务器从正常状态到问题发生时所需要用的时间。请使用下表来决定采样的间隔。 您可以手动创建系统性能日志或者通过性能监视器向导来完成工作。
需要收集的计数器如下:
- 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秒 |
2. 如果您碰到的是分页池或者非分页池泄漏并最终耗尽的问题,请收集Pool Monitor (PoolMon) 日志,同样的,需要确保收集的时间涵盖问题发生的时段。PoolMon的采样频率也取决于问题发生的频率。请参考下表:
问题的发生频率 |
对应的采样时间 |
每周发生 |
1小时 |
每天发生 |
15分钟 |
每小时发生 |
60秒 |
我们强烈建议同时收集性能监视器(perfmon)和PoolMon的数据,这样可以在他们之间找出一些关联的信息。
1. 对于这类问题,同样也可能有必要在问题发生时去抓一个完全内存转储。在大多数的情况下我们可以通过键盘来触发一个蓝屏并产生内存转储文件,具体信息请参考使用Ctrl-Scroll产生内存转储文件。如果,您的系统支持iLO,您可以使用NMI来产生内存转储文件,具体信息请参考使用NMI产生内存转储文件。无论使用哪种方式,最重要的是您需要确保您系统盘上页面文件的大小至少比RAM的总量多100MB。
2. 如果您的系统的RAM非常大,但是系统盘上的空间却非常有限,那么为了能够成功的产生内存转储文件,您需要使用MAXMEM将RAM限制到一个合理的大小(比如将一个16GB的系统暂时限制到4GB)。如果实际情况不允许这么操作,那么根据问题的情况,可以酌情去产生一个内核内存转储。
解决方案: 当您收集到了这些数据后,请按照下列步骤来做检查:
1. MPS Report的分析
- 查看系统日志中是否有2019或者2020错误记录。
- 筛选出一些过时的,较旧的组件,比如设备驱动程序,过滤驱动程序等。
2. 性能监视器日志的分析
- 查看是否有进程的内存使用量是保持上升趋势的。从图上来看,这种趋势可能显示为一种斜线或者阶梯状的上升趋势。
本文转译自AskPerf的博客文章, 原文链接如下: