当系统文件缓存耗用大量物理 RAM 时,您会在应用程序和服务中遇到性能问题

适用于: Microsoft Windows XP Professional x64 EditionWindows Vista Home BasicWindows Vista Home Premium

症状


在应用程序中的性能问题和各种版本的 Windows XP、 Windows Vista、 Windows Server 2003,Windows Server 2008 中和 Windows Server 2008 R2 中的服务您的经验。此外,您还注意到下列症状︰
  • 可用内存是几乎耗尽。
  • 系统文件缓存耗用大量物理 RAM。
  • 存在对磁盘持续且大量的缓存读取请求

原因


在 Microsoft Windows 操作系统中的内存管理使用基于请求的算法。如果任何进程请求,并使用大量内存,进程的工作集 (在物理 RAM 中的内存页面数) 都会增大。 如果这些请求持续且未加抑制,进程的工作集将会增长至占用所有的物理 RAM。 在此情况下,其他所有进程的工作集调出到硬盘。 这种行为降低了应用程序和服务的性能,因为内存页是连续写入硬盘和从硬盘读取的。

这种行为同样适用于系统文件缓存的工作集。如果没有持续和高卷的缓存读请求从任何进程或任何驱动程序,系统文件缓存的工作集大小将增长来满足这一需求。 系统文件缓存使用的物理 RAM。因此,足够的物理内存量不可用于其他进程。

在 32 位 Windows 操作系统版本早于 Windows Vista,系统文件缓存的工作集是有理论内存限制为小于 1 千兆字节 (GB)。虚拟地址范围的限制可以防止耗尽物理 RAM 的系统文件缓存的工作集。

在 32 位版本的 Windows Vista 操作系统,动态分配核心资源。系统文件缓存的工作集增加消耗而忽略其他内核资源的内核模式虚拟地址范围。此内存范围限制为小于 2 GB。如果计算机有多个 2 GB 的物理内存,缓存不能耗尽所有的物理 RAM。但是,缓存可以耗尽在内核虚拟地址空间。 这会导致其他内核组件分配失败。

在 64 位版本的 Windows 操作系统,通常超过物理 RAM 了虚拟地址范围的大小。在此情况下,系统文件缓存的工作集可以增加消耗大部分的物理 RAM。

解决方案


在 Windows 7 和 Windows Server 2008 R2 操作系统的内存管理算法已更新,可以解决许多文件缓存在 Windows 的早期版本中发现的问题。有只需要计算机正在运行 Windows 7 或 Windows Server 2008 R2 上实现此服务,某些特殊情况。

如何确定您的系统是否受影响

若要确定您的系统是否受此问题,请安装 SysInternals RamMap 工具。您可以从以下 Windows Sysinternals 网站获取该工具︰
 
运行该工具时,选择使用计数选项。这将显示几个列,以显示当前的内存使用模式。单击活动列进行排序,所用的字节数,并注意下方总的顶部使用情况。

如果顶部使用计数是"图元文件,"并正在使用的可用内存很大一部分,如果您遇到"症状"一节中描述的系统文件缓存问题。可以对其进行如此验证︰ 即通过使用性能监视器来监视Memory\System 缓存驻留在字节计数器并查看缓存持续不断增长中。

图 1。示例 RamMap 输出的计算机出现了问题。



图 2。计算机没有遇到此问题的示例 RamMap 输出。



如果在性能监视器中的Memory\System 高速缓存驻留在字节计数器显示一段时间的上升趋势,计算机如图 3 所示出现问题。

图 3。性能监视器输出示例的计算机遇到问题随着时间的推移。

重新启动要求

不需要重新启动计算机,当您安装、 卸载或使用此项服务。
如果您读这篇文章,因为您正在使用认为它们受此问题的客户,请按照以下步骤来帮助您解决问题。
  1. 请验证该客户的 RamMap 输出,perfmon 或 poolmon 数据确认系统文件缓存占用了大部分的物理 RAM,如前面所述。
  2. 若要获取 Windows 动态缓存服务,下载它这里
  3. 一些动态缓存注册表设置如下所示︰

    文件服务器,您可能想要尝试 1 GB。
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DynCache\Parameters]
    "MaxSystemCacheMBytes"=dword:00000400
    "MinSystemCacheMBytes"=dword:00000064
    "SampleIntervalSecs"=dword:0000003c
    "CacheUpdateThresholdMBytes"=dword:00000064

    Exchange 2007,您可能想要尝试 500 MB:
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DynCache\Parameters]
    "MaxSystemCacheMBytes"=dword:000001F4
    "MinSystemCacheMBytes"=dword:00000064
    "SampleIntervalSecs"=dword:0000003c
    "CacheUpdateThresholdMBytes"=dword:00000064

    SQL 2005 及更高版本,过去在处理 SQL EE 的已经使用 2 GB:
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DynCache\Parameters]
    "MaxSystemCacheMBytes"=dword:000007D0
    "MinSystemCacheMBytes"=dword:00000064
    "SampleIntervalSecs"=dword:0000003c
    "CacheUpdateThresholdMBytes"=dword:00000064

详细信息


若要变通解决此问题,请使用GetSystemFileCacheSize API 函数和SetSystemFileCacheSize API 函数来设置系统文件缓存的工作集的大小最大值或最小值。这些函数的用法是唯一受支持的方法来限制系统文件缓存的物理内存的消耗。

Microsoft Windows 动态缓存服务是演示如何使用这些 Api 来将这一问题的影响降至最低的一种策略的示例服务。

安装和使用 Microsoft 动态缓存服务不会排除对 Microsoft Windows 的支持。作为举例说明如何使用 Microsoft 支持降低增长的文件系统缓存 Api 提供此服务,它的源代码。

您可以从以下 Microsoft 网站获得服务和源的代码︰
 

其他资源

Windows 内核,第五版阅读章节 9 (内存管理) 和 10 (缓存管理器)。

内存管理 (大系统缓存问题) 博客张贴内容

较慢的大型文件复制问题博客张贴内容

对于 Windows 版本的内存限制

976618应用程序和服务中的性能问题时遇到的系统文件缓存耗用大量物理 RAM

918483如何减少分页缓冲池内存在 SQL Server 的 64 位版本

895932操作来启用 Windows XP 中的系统缓存模式之前,请考虑

232271如何优化 Windows NT 服务器,使用注册表

837331关于高速缓存管理器在 Windows Server 2003 中

http://technet2.microsoft.com/windowsserver/en/library/EFA621BD-A031-4461-9E72-59197A7507B61033.mspx

LargeSystemCache TechNet 主题

RamMap 博客张贴内容

状态


Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。