症状
在各种版本的 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. 计算机在一段时间遇到问题的示例性能监视器输出。
重启要求
安装、卸载或使用此服务时,无需重启计算机。
如果你正在阅读本文,因为正在与认为他们受此问题影响的客户合作,请执行以下步骤来帮助解决问题。
-
如前面所述,验证客户的 RamMap 输出、性能或 poolmon 数据是否确认系统文件缓存消耗了大部分物理 RAM。
-
若要获取 Windows 动态缓存服务,请在此处 下载。
-
某些动态缓存注册表设置如下所示:
文件服务器,可能需要尝试 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 网站获取服务和源代码:
其他资源
阅读 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 产品问题。