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

应用对象
Microsoft Windows XP Professional x64 Edition Windows Vista Home Basic Windows Vista Home Premium Windows Vista Business Windows Vista Enterprise Windows Vista Ultimate Windows Vista Home Basic 64-bit Edition Windows Vista Home Premium 64-bit Edition Windows Vista Enterprise 64-bit Edition Windows Vista Ultimate 64-bit Edition Windows Server 2008 Datacenter without Hyper-V Windows Server 2008 Enterprise without Hyper-V Windows Server 2008 Standard without Hyper-V Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 for Itanium-Based Systems Windows Server 2008 R2 Datacenter Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Standard

症状

在各种版本的 Windows XP、Windows Vista、Windows Server 2003、Windows Server 2008 和 Windows Server 2008 R2 中的应用程序和服务中遇到性能问题。 此外,你还注意到以下症状:

  • 可用内存几乎耗尽。
  • 系统文件缓存占用大部分物理 RAM。
  • 对硬盘有连续且大量的缓存读取请求。

原因

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

此行为也适用于系统文件缓存的工作集。 如果有来自任何进程或任何驱动程序的连续且大量缓存读取请求,则系统文件缓存的工作集大小将增长以满足此需求。 系统文件缓存占用物理 RAM。 因此,没有足够的物理 RAM 用于其他进程。

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

在 32 位版本的 Windows Vista 操作系统上,内核资源是动态分配的。 系统文件缓存的工作集增加,以消耗其他内核资源为代价来使用内核模式的虚拟地址范围。 此内存范围的限制小于 2 GB。 如果计算机的物理 RAM 超过 2 GB,则缓存无法耗尽所有物理 RAM。 但是,缓存可能会耗尽内核中的虚拟地址空间。 这可能导致其他内核组件分配失败。

在 64 位版本的 Windows 操作系统上,虚拟地址范围的大小通常大于物理 RAM。 在这种情况下,系统文件缓存的工作集可能会增加以占用大部分物理 RAM。

解决方法

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

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

若要确定你的系统是否受此问题影响,请安装 SysInternals RamMap 工具。 可以从以下 Windows Sysinternals 网站获取该工具:

http://technet.microsoft.com/en-us/sysinternals/ff700229
运行该工具时,选择 使用计数 选项。 这将显示多个显示当前内存使用模式的列。 单击 活动 列按使用的字节数进行排序,并在总字节数正下方记下最高使用量。

如果最大使用计数为“元文件”,并且正在使用大部分可用内存,则你正在经历“症状”部分中描述的系统文件缓存问题。 可以通过使用性能监视器监视内存\系统缓存常驻字节计数器来验证这一点,并查看缓存随时间持续增长。

图 1. 计算机遇到问题的示例 RamMap 输出。

显示高元文件内存使用率的 RAMMap 使用计数输出

图 2. 计算机未遇到问题的示例 RamMap 输出。

RAMMap 使用计数输出,显示在没有过度使用元文件的情况下的内存使用情况

如果性能监视器中的内存\系统缓存常驻字节计数器显示随时间推移呈上升趋势,则计算机遇到了该问题,如图 3 所示。

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

显示系统缓存常驻字节随时间增加的性能监视器图形

重启要求

安装、卸载或使用此服务时,无需重启计算机。

如果您正在阅读本文,因为您正在与认为自己受此问题影响的客户合作,请按照以下步骤帮助解决问题。

  1. 验证客户的 RamMap 输出、性能或 poolmon 数据是否确认系统文件缓存正在消耗大部分物理 RAM,如前文所述。

  2. 若要获取 Windows 动态缓存服务,请 在此处下载。

  3. 某些动态缓存注册表设置如下所示:

    文件服务器,你可能想尝试 1GB。
    [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 EE 时,SQL 2005 及更高版本使用 2GB:
    [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 网站获取服务和源代码:

http://www.microsoft.com/download/details.aspx?FamilyID=e24ade0a-5efe-43c8-b9c3-5d0ecb2f39af&displaylang=en

其他资源

阅读第 9 章 (内存管理) 和第 10 章 (缓存管理器 Windows Internals 第 5 版) 。

大型系统缓存 (内存管理) 博客文章

慢速大文件复制问题博客文章

Windows 版本的内存限制

976618 当系统文件缓存占用大部分物理 RAM 时,应用程序和服务中会遇到性能问题

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

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 产品中存在问题。