排查缓存和内存管理器性能问题

在Windows Server 2012,两个主要的潜在问题导致系统文件缓存增长,直到可用内存在某些工作负载下几乎耗尽。 当这种情况导致系统缓慢时,可以确定服务器是否面临这些问题之一。

要监视的计数器

  • 内存\长期平均备用缓存生存期 (< 1800) 秒

  • 内存\可用 MB 不足

  • Memory\System Cache 驻留字节数

如果 Memory\Available Mbytes 较低,同时 Memory\System Cache 驻留字节占用物理内存的很大一部分,可以使用 RAMMAP 来找出缓存用于什么。

系统文件缓存包含 NTFS 图元文件数据结构

此问题由 RAMMAP 输出中的大量活动图元文件页指示,如下图所示。 此问题可能在访问数百万个文件的繁忙服务器上观察到,从而导致缓存 NTFS 图元文件数据未从缓存中释放。

rammap view

DynCache 工具过去要缓解的问题。 在 Windows Server 2012+ 中,体系结构已经过重新设计,此问题应该不再存在。

系统文件缓存包含内存映射文件

RAMMAP 输出中的大量活动映射文件页指示了此问题。 这通常表示服务器上某些应用程序正在使用 CreateFile API 打开大量大型文件,FILE_FLAG_RANDOM_ACCESS设置。

此问题在知识库文章中进行了2549369。 FILE_FLAG_RANDOM_ACCESS标志是缓存管理器的提示,它尽可能长时间将文件的映射视图保留 (直到内存管理器未指示内存不足) 。 同时,此标志指示缓存管理器禁用文件数据的预提取。

这种情况已通过在 Windows Server 2012+ 中的工作集修整改进在一定程度上得到了缓解,但问题本身主要需要由应用程序供应商处理,而不是FILE_FLAG_RANDOM_ACCESS。 应用供应商的替代方法可能是在访问文件时使用低内存优先级。 这可以使用 SetThreadInformation API 实现。 以低内存优先级访问的页面会更主动地从工作集中删除。

从 Windows Server 2016 开始,在做出修整决策时忽略 FILE_FLAG_RANDOM_ACCESS 可进一步缓解这种情况,因此,与在未使用 FILE_FLAG_RANDOM_ACCESS 标志的情况下打开的其他任何文件一样, (缓存管理器仍遵守此标志来禁用文件数据) 的预提取。 如果使用此标志打开大量文件,并且以真正随机的方式访问,则仍可能导致系统缓存膨胀。 强烈建议FILE_FLAG_RANDOM_ACCESS应用程序使用。

始终超过远程文件脏页阈值

如果系统在从远程客户端进行写入期间偶尔遇到速度减慢,则表明此问题。 当大量数据从快速远程客户端写入慢速服务器目标时,可能会出现此问题。

在Windows Server 2016,在这种情况下,如果达到缓存中的脏页阈值,则进一步写入的行为就像存在写进一样。 这可能会导致将大量数据刷新到磁盘,如果存储速度较慢,可能会导致长时间延迟,从而导致远程连接超时。

在 Window Server 2016 及之后,将采取缓解措施以降低超时的可能性。 实现了远程写入的单独脏页阈值,超过该阈值时将执行内联刷新。 这可能会导致在大量写入活动期间偶尔降低速度,但在大多数情况下消除了超时的风险。 默认情况下,此远程脏页阈值 是每个文件 5 GB。 对于某些配置和工作负荷,不同的数字的性能会更好。

可以使用以下注册表项控制此阈值:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\RemoteFileDirtyPageThreshold。 如果默认大小 5 GB 对配置不起作用,建议尝试以 256 MB 的增量提高限制,直到性能满意。 请注意以下事项:

  • 若要使此注册表项的更改生效,需要重新启动。

  • RemoteFileDirtyPageThreshold 的单位是页大小由缓存管理器 (管理的页面) 。 这意味着它应设置为所需的大小(以字节为单位,除以 4096)。

  • 建议值为 128MB < = N = < 50% 的可用内存。

  • 可以通过将阈值设置为 -1 来完全禁用此阈值。 不建议这样做, 因为它可能会导致远程连接超时。