检查系统页面交换文件的使用

我们都知道在Windows操作系统中,页面交换文件(Paging File)的配置是很重要的一项。在Internet上我们也可以找到很多对于页面交换的设置建议,例如:

  1. 设置页面交换文件的大小为系统内存的1.5倍。
  2. 尽可能将页面交换文件设置在非系统磁盘以获得更好的IO性能。
  3. 合理考虑系统蓝屏时产生Memory.dmp的需求。

当设置完成后,我们一般不需要再去监控页面交换文件的使用情况,除非系统报告说虚拟内存资源耗尽等警告信息。

一般情况下,当系统的页面交换文件大小设定以后,虚拟内存管理的一个系统限制Commit Limitation也就设定了。在Windows系统中,虽然应用程序是以虚拟内存的方式来管理本程序的资源,但最终还是存在虚拟内存到实际物理存储设备(内存或是页面交换文件)的映射关系。Commit Limitation保证了当前系统中 所有程序Commit的虚拟内存在任何极端情况下还是可以在物理设备中可以支持它的空间。

如果系统报告虚拟内存资源耗尽,通常做法是调整页面交换文件的大小来增大Commit Limitation,同时,我们需要通过系统性能日志来查看各个进程的资源使用情况以确保没有资源泄露的情况发生。否则,即便是调整 了页面交换文件,虚拟内存资源耗尽的问题还是会重复发生。在检查是否存在内存泄露时,我们通常会检查所有进程的Private Bytes, Virtual Bytes和Working Set等计数器。

需要注意的是,并不是只有当系统的物理内存资源耗尽或是资源紧张时,我们才会看到很高的页面交换文件使用率。在我最近处理的一个案例中,该系统中有大量的物理内存处于闲置状态,而且可用物理内存的数量保持恒定,但是系统的页面交换文件的使用率持续上升。而通过检查各个进程的虚拟内存使用情况,所有进程的 资源使用都在合理的范围内。

在Windows操作系统中,为了提供给用程序更方便的方法管理内存以及在多个应用程序之间共享数据,系统提供了Memory-Mapped Files的方法。更多相关信息请参考https://msdn.microsoft.com/en-us/library/ms810613.aspx。同过Memory-Mapped Files,应用程序可以直接操作页面交换文件。一个常见的例子是Process Monitor工具。我们可以通过handle.exe,https://technet.microsoft.com/en-us/sysinternals/bb896655.aspx, 来了解应用程序通过Mapped File来直接读写页面交换文件的情况。

Handle –a -l

在使用Memory-Mapped Files时,操作系统内核通过Section对象来进行管理。我们可以通过系统性能日志中的Objects > Sections来观察该对象的使用情况。我们曾经看到过因为Sections对象的 句柄泄露而导致页面交换文件耗尽。

本博文仅供参考,微软公司对其内容不作任何责任担保或权利赋予。