![Windows 文件缓存突然丢失](https://linux22.com/image/569319/Windows%20%E6%96%87%E4%BB%B6%E7%BC%93%E5%AD%98%E7%AA%81%E7%84%B6%E4%B8%A2%E5%A4%B1.png)
我有一台 64 位 Windows 2003 服务器,它有 48 个 CPU 核心和 128GB RAM,运行单个应用程序 (SQL 2008 Analysis Services)。SSAS 当前使用大约 50GB 内存。
SSAS 很大程度上依赖 Windows 文件缓存来保存常用数据(请参阅本文,例如)。在我的服务器上,Windows 文件缓存通常在 10-15GB 范围内,但偶尔会突然降至 5-6GB(Memory\System Cache Resident Bytes
)。发生这种情况时,所有 SSAS 页面读取都必须转到磁盘,查询开始超时,直到文件缓存重新填充。
我有第二台服务器(只有 24 个核心,但其他方面几乎相同),它没有表现出相同的症状,即使运行完全相同的 SSAS 实例、相同的查询和相同的负载(这是一个负载平衡的环境)。
我问过详细的 SSAS 重点问题在 dba.stackexchange.com 上,但关于 Windows 行为有几个问题:
有没有办法知道为什么 SSAS 数据库文件会从缓存中清除?
我可以预先填充文件缓存或以某种方式主动管理它吗?(我不确定使用 RAMDRIVE是我们环境中的一个选项)
有一次,我们确实将服务器上的网络优化设置更改为“最大化文件共享的数据吞吐量”以匹配另一个框,但这似乎并没有带来显着的差异。
编辑:增加了悬赏。如果我们无法回答“为什么”,那么也许只是一种更好地了解哪些进程当前正在使用缓存、缓存中有哪些文件或可能引导我们朝正确方向前进的方法。
答案1
我通常不会直接发布链接,但由于你还没有得到任何帮助,请检查这出。这是一篇关于缓存管理器如何工作的极其详细的文章。
每秒都会运行一个进程来评估哪些内容可以写入磁盘并从缓存中刷新。您特别询问是否有办法查看哪些进程正在使用缓存或缓存中有哪些文件。我的理解是,所有磁盘读写都被缓存,因此所有读取或写入磁盘的进程都将“使用”缓存。但我还没有找到任何方法可以查看内容。
系统文件缓存中的文件数据按照操作系统确定的间隔写入磁盘,并且释放该文件数据先前使用的内存 - 这称为刷新缓存。延迟将数据写入文件并将其保存在缓存中直到刷新缓存的策略称为延迟写入,它由缓存管理器在确定的时间间隔内触发。刷新文件数据块的时间部分取决于它在缓存中存储的时间以及自上次读取操作访问数据以来的时间. 这可确保频繁读取的文件数据在系统文件缓存中保持可访问状态的时间最长。细节
在 Server 2003 中,如果缓存管理器不尝试将修改后的文件数据写回文件,并且可用内存变得稀缺,则内存管理器的修改写入线程会将未写入的数据写回文件。系统不依赖内存管理器将文件数据刷新回磁盘。相反,缓存管理器会尝试使用“延迟写入”过程及时将数据写回非易失性存储。当程序修改文件数据时,缓存管理器会跟踪有多少数据被修改或“脏”。缓存管理器每秒将缓存修改数据的八分之一写回磁盘。细节
答案2
LimitSystemFileCacheSizeMB 设置的值是多少?
Analysis Services 操作指南
http://download.microsoft.com/download/B/E/1/BE1AABB3-6ED8-4C3C-AF91-448AB733B1AF/SSASOpsGuide2008R2.docx
一个有趣的实用程序可以为您提供有关服务器内存使用情况的详细信息,它是内存地图。特别是,StandBy Cache 上可能还存在您不知道的正在使用的内存。