症状
在各种版本的 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 输出。
图 2. 计算机未遇到问题的示例 RamMap 输出。
如果性能监视器中的内存\系统缓存常驻字节计数器显示随时间推移呈上升趋势,则计算机遇到了该问题,如图 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:00000064Exchange 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 网站获取服务和源代码:
其他资源
阅读第 9 章 (内存管理) 和第 10 章 (缓存管理器 Windows Internals 第 5 版) 。
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
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。