使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

症状

在各种版本的 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
运行该工具时,选择"使用计数"选项。 这会显示多个列,这些列显示当前的内存使用模式。 单击"活动 "列以按使用的字节数排序,并直接在总计下记下使用量最高。

如果最重的使用计数是"图元文件",并且使用大量可用内存,则遇到"症状"部分所述的系统文件缓存问题。 可以使用性能监视器来监视 Memory\System Cache Resident Bytes 计数器,并查看缓存在一段时间的不断增加,来验证这一点。

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


备用文本
图 2. 计算机未遇到此问题的示例 RamMap 输出。


备用文本
如果性能监视器中的 Memory\System Cache Resident Bytes 计数器显示一段时间的上升趋势,则计算机正遇到此问题,如图 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 的 2005 和更高版本SQL EE 使用 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

其他资源

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

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

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

Windows 版本的内存限制

976618当系统文件缓存使用大部分物理 RAM

918483如何在 64 位版本的 SQL Server 895932 Things 中减少缓冲池内存的分页时,你遇到应用程序和服务中的性能问题 在 Windows XP 232271 中启用系统缓存模式之前,请考虑如何使用

注册表



837331关于 Windows Server 2003

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

LargeSystemCache TechNet 主题

RamMap博客文章优化 Windows NT 服务器 

状态

Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×