SQL每隔几分钟就会从缓冲区缓存中转储所有页面


9

我有一个运行多个数据库的SQL2012 SP4节点。

该服务器有20GB可用内存,已为SQL分配了14GB内存(包装盒上没有其他任何东西)。

SQL每隔几分钟就会转储整个缓冲区高速缓存。页面预期寿命为零,缓冲区高速缓存描述符显示高速缓存中没有任何内容。

我查看了资源监视器通知,并且通知每隔几毫秒从高/稳定/低反弹一次:

RESOURCE_MEMPHYSICAL_LOW RESOURCE_MEM_STEADY RESOURCE_MEMPHYSICAL_LOW

时间戳相隔几毫秒。PLE本质上是锯齿形。

我已经在SQL2012 SP1和以下问题之前看到过这种情况:

未使用缓冲区高速缓存中的SQL Server 2012可用页

似乎是类似的问题,尽管我已经更新到SP4。

我尝试为该服务帐户打开LPIM,并且尝试弄乱最大内存设置。降低最大内存似乎已导致缓冲区缓存更频繁地清空。

关于下一步要检查的任何想法?

服务器工作负载实际上什么都没有(我正在滚动浏览ERP系统中的项目列表,在缓存再次下降之前,它达到了40-50MB)。

这很有趣,因为我从SP1升级以尝试解决此问题-那里的缓存已达到500MB左右。从那以后,我将最大内存设置降低到14GB,这似乎使情况变得更糟。

我想知道Windows是否惊慌并在SQL上发出有关内存压力的不正确通知-随之而来的是,将最大内存设置为无界的服务器似乎运行正常,但永远不会填满超过几百MB的缓存-但现在它刚到50岁...

更多信息:对于那些询问

核心数: 4

数据库大小: 80GB

错误日志显示: A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set (KB): 247928, committed (KB): 495656, memory utilization: 50%.

从此链接运行脚本的结果:https : //www.sqlskills.com/blogs/jonathan/identifying-external-memory-pressure-with-dm_os_ring_buffers-and-ring_buffer_resource_monitor/

内存压力查询结果

不确定如何解释它们-看起来在不同时间都有内部和外部内存压力。

更多信息:

这是一台Hyper-V来宾,坐在主机上,总内存为96GB,其中约一半分配给了来宾。

症状似乎与此类似:

SQL Server 2012 x64-无法安全分配超过50%的RAM

但是,当我为SQL分配14GB时,症状立即出现(仅有3GB的服务器内存被提交)

昨晚,我将客户机内存增加到32GB,问题消失了,但是我看到只有14GB的服务器总内存提交了(运行DB的业务今天早上很忙,这是他们通常遇到性能问题的时候)。

目前,缓存中大约有8-9GB的数据,看起来很稳定。

似乎表明20GB足以满足此框上的工作负载。我现在很高兴将其留给32GB,但我真的很想深入了解它,以便更好地配置VM / SQL。

如果找到答案,我将继续挖掘和更新!

更多信息:

开启LPIM之后,我没有重新启动SQL(没有意识到这是必需的),但是我确实保留了此设置并重新启动以升级内存,所以现在我不确定内存的增加或LPIM是否已缓解了问题。

今晚服务器空闲时将跳入并再次检查其20GB的外观。

更多信息:

目前,服务器分配了32GB的内存,一切正常,此后我们再也没有发现问题。如果再次出现,我将回到这个问题并继续挖掘。

目前仍然是个谜,但是我的猜测是我目前只是掩盖这些问题。


3
这是虚拟机吗?听起来像VMware的气球驱动程序造成了内存压力。
Max Vernon

1
如果这是在VMWare上运行的VM,请查看本文:在VMware上对CPU性能进行故障排除。我知道标题中说的是CPU,但是那里也有关于内存计数器的信息。
Erik Darling

是的,它是一台运行3台服务器的hyper-v主机。感谢您提供的信息,我将对其进行检查
-Charleh

到目前为止,我发现主机有足够的内存来添加另外12GB。我允许使用SQL 24GB(使来宾最多可使用32GB),到目前为止,它似乎更健康,但是我仍然想了解它的情况,因为14-16GB似乎足以应付SQL消耗的工作量每天..
查理

1
您调查了热气球飞行吗?如果VMWare启动气球驱动程序,则OS将发出内存不足的信号,并且SQL Server将作出相应的响应。第一步是调查是否有气球膨胀。
Tibor Karaszi

Answers:


4

尽管您似乎已经自己解决了该问题,但是这里是解决方案相关信息的摘要。

服务器内存服务器配置选项

Microsoft在其文章“ 服务器内存服务器配置选项(Microsoft | SQL Docs)”中撰写了“ 手动设置内存选项 ”部分

重点是我的)

同样,在虚拟化环境中,设置min_server_memory至关重要,以确保来自底层主机的内存压力不会试图来宾SQL Server虚拟机(VM)上的缓冲池中释放内存,而不是达到可接受性能所需的内存

关于“ 内存中的锁定页面 ”的部分(同一文档)具有引人注目的相等段落,其内容如下:

重点是我的)

此Windows策略确定哪些帐户可以使用进程将数据保留在物理内存中,从而防止系统将数据分页到磁盘上的虚拟内存。在发生向磁盘分页内存时,锁定内存中的页面可以使服务器保持响应。在具有运行sqlservr.exe特权的帐户已被授予Windows内存中锁定页面(LPIM)用户权限的情况下,在SQL Server Standard Edition和更高版本的实例中,“内存中锁定页面”选项设置为ON。

LPIM部分继续说明:

重点是我的)

设置此选项不会影响SQL Server动态内存管理,而是允许它根据其他内存管理员的要求进行扩展或收缩。当使用“内存中的锁定页面”用户权限时,建议如上所述设置最大服务器内存的上限

...并且在重要的评论中指出:

重点是我的)

仅在必要时,即有迹象表明sqlservr进程正在被调出时,才应使用设置此选项。在这种情况下,错误日志中将报告错误17890,类似于以下示例:

A significant part of sql server process memory has been paged out. 
This may result in a performance degradation. Duration: #### seconds. 
Working set (KB): ####, committed (KB): ####, memory utilization: ##%.  

从SQL Server 2012(11.x)开始,对于Standard Edition使用锁定页面,不需要跟踪标志845。

根据上述发现和您的观察,解决问题的方法是配置以下设置:

  1. min_server_memory (5-10 GB?)根据您的评论:

    目前,缓存中大约有8-9GB的数据,看起来很稳定。

    ...以及Microsoft关于设置的建议min_server_memory

  2. max_server_memory (20-32 GB)根据您的观察结果:

    似乎表明20GB足以满足此框上的工作负载。我现在很高兴将其留给32GB,但我真的很想深入了解它,以便更好地配置VM / SQL。

    ...以及Microsoft关于设置的建议max_server_memory

  3. 锁定内存中的页面:已为SQL Server服务帐户启用。
    基于您提到的SQL Server实例的ERRORLOG条目以及本文中Microsoft的引用。

    仅在必要时,即在有迹象表明sqlservr进程正在被调出时,才应使用设置此选项。

在继续之前...

具有虚拟化环境的好处之一是可以/应该共享资源,甚至可能过度使用资源。但是,如果硬件托管多个实例,则打开“内存中的锁定页面(LPIM)”可能会对您的Hyper-V环境产生负面影响。RAM的过量使用可能会耗尽其他实例。

在考虑切换所有操作杆之前,请先从设置1.和2.开始。如果无法微调这些内存设置,请在硬件足够的情况下考虑打开LPIM 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.