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

Cha*_*leh 9 sql-server memory cache sql-server-2012

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

服务器有 20GB 可用内存,14GB 分配给 SQL(盒子上没有其他东西在运行)。

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

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

RESOURCE_MEMPHYSICAL_HIGH 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(运行数据库的业务今天早上很忙,这是他们通常遇到性能问题的时候)。

目前缓存中大约有 8-9GB 的数据,似乎是稳定的。

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

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

更多信息:

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

今晚将在服务器空闲时跳转并再次检查它看起来如何 20GB。

更多更多信息:

目前,服务器运行正常,分配了 32GB,从那以后我们就没有看到这个问题。如果再次出现这种情况,我会回到这个问题并继续挖掘。

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

Joh*_* N. 4

尽管您似乎自己解决了该问题,但以下是围绕该解决方案的相关信息的摘要。

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

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

强调我的)

此外,在虚拟化环境中设置min_server_memory至关重要,以确保来自底层主机的内存压力不会尝试从来宾 SQL Server 虚拟机 (VM) 上的缓冲池中释放超出可接受性能所需的内存。

关于内存中的锁定页面(同一文档)的部分有一个同样引人注目的段落,内容如下:

强调我的)

此 Windows 策略确定哪些帐户可以使用进程将数据保存在物理内存中,从而防止系统将数据分页到磁盘上的虚拟内存。当将内存分页到磁盘时,锁定内存中的页面可以使服务器保持响应。当具有运行 sqlservr.exe 权限的帐户被授予 Windows 内存锁定页面 (LPIM) 用户权限时,在 SQL Server 标准版及更高版本的实例中,“内存锁定页面”选项设置为 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: ##%.  
Run Code Online (Sandbox Code Playgroud)

从 SQL Server 2012 (11.x) 开始,标准版不需要跟踪标志 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 。


归档时间:

查看次数:

498 次

最近记录:

6 年,4 月 前