不知道从什么时候开始,网上开始流传一种说法,WS2008系统自带缓存有Bug,然后可能导致服务器内存耗尽而死机!然后网上就出了一些工具解决这些问题!但事实上我一直没能从微软官方资料获得相关说明,自己也没遇到过这种现象,于是一直耿耿于怀……
注:大家可能经常看到WS2008、WS2012的写法,WS=Windows Server的首字母简写,本站搜索文章推荐简写方式。
而今天在翻阅云更新产品历史更新时,发现从V2015.4.15.830版本已经会自动修改2008系统自带缓存大小,于是勾起了研究的兴趣。功夫不负有心人,终于找到微软资料,并已证实2008系统确实存在该问题,但在Windows 7和Windows Server 2008r2版本中已经得到更新,“可以解决已经发现的问题”。
微软资料中对WS2008系统缓存耗尽导致服务器死机的原因说明:
在 Microsoft Windows 操作系统中的内存管理使用基于请求的算法。如果任何进程请求,并使用大量内存,进程的工作集 (在物理内存中的内存页面数) 都会增大。如果这些请求持续且未加抑制,进程的工作集将会增长至占用所有的物理内存。在此情况下,其他所有进程的工作集调出到硬盘。这种行为降低了应用程序和服务的性能,因为内存页是连续写入硬盘和从硬盘读取的。
这种行为同样适用于系统文件缓存的工作集。如果这些请求是连续的且不受控制的,则该进程的工作集将继续增长,直到消耗尽所有物理内存。在这种情况下,所有其他进程的工作集分页到硬盘,被占用的物理内存量不可用于其他进程。
在 32 位 Windows 操作系统版本早于 Windows Vista,系统文件缓存的工作集是有理论内存限制为小于 1 千兆字节 (GB)。
在 32 位版本的 Windows Vista 操作系统,动态分配核心资源。
在 64 位版本的 Windows 操作系统,虚拟地址范围通常通常超过了物理大小。
WS2008系统缓存耗尽导致服务器死机的解决方法:
若要变通解决此问题,请使用GetSystemFileCacheSize API 函数和SetSystemFileCacheSize API 函数来设置系统文件缓存的工作集的大小最大值或最小值。
Microsoft Windows 动态缓存服务是演示如何使用这些 Api 来将这一问题的影响降至最低的一种策略的示例服务。
安装和使用 Microsoft 动态缓存服务不会排除对 Microsoft Windows 的支持。
您可以从以下 Microsoft 网站获得服务和源的代码:
若要确定您的系统是否受此问题,请安装 SysInternals RamMap 工具。
运行该工具时,选择使用计数选项。这将显示多个列,以显示当前模式的内存使用情况。单击Active列进行排序使用字节数,并注意总使用量(Total)。如果排列在顶部的使用计数是”Metafile”,并使用了大部分可用的内存。或者您遇到”症状”一节中描述的系统文件缓存问题。可以对其进行如此验证: 即通过使用性能监视器监视的Memory\System Cache Resident Bytes计数器并查看随着时间的推移不断增长的缓存用量。
图 1。存在问题的 RamMap 示例。
图 2。正常的 RamMap 示例。
如果在性能监视器中的Memory\System Cache Resident Bytes计数器显示一段时间的上升趋势,计算机如图 3 所示出现问题。
图 3。性能监视器输出示例的计算机遇到问题随着时间的推移。