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,从那以后我们就没有看到这个问题。如果再次出现这种情况,我会回到这个问题并继续挖掘。
目前仍然是个谜,但我的猜测是我目前只是掩盖了这些问题。
尽管您似乎自己解决了该问题,但以下是围绕该解决方案的相关信息的摘要。
Microsoft 在其文章“服务器内存服务器配置选项” (Microsoft | SQL Docs) 中编写了手动设置内存选项部分
(强调我的)
此外,在虚拟化环境中设置min_server_memory值至关重要,以确保来自底层主机的内存压力不会尝试从来宾 SQL Server 虚拟机 (VM) 上的缓冲池中释放超出可接受性能所需的内存。
关于内存中的锁定页面(同一文档)的部分有一个同样引人注目的段落,内容如下:
(强调我的)
此 Windows 策略确定哪些帐户可以使用进程将数据保存在物理内存中,从而防止系统将数据分页到磁盘上的虚拟内存。当将内存分页到磁盘时,锁定内存中的页面可以使服务器保持响应。当具有运行 sqlservr.exe 权限的帐户被授予 Windows 内存锁定页面 (LPIM) 用户权限时,在 SQL Server 标准版及更高版本的实例中,“内存锁定页面”选项设置为 ON。
LPIM 部分继续解释说:
(强调我的)
设置此选项不会影响 SQL Server 动态内存管理,允许其根据其他内存管理员的请求进行扩展或收缩。使用“锁定内存页面”用户权限时,建议设置最大服务器内存的上限,如上所述。
...并在重要评论中指出:
(强调我的)
仅在必要时才应设置此选项,即如果有迹象表明 sqlservr 进程正在被调出。在这种情况下,错误日志中将报告错误 17890,类似于以下示例:
Run Code Online (Sandbox Code Playgroud)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) 开始,标准版不需要跟踪标志 845 来使用锁定页。
根据上述发现和您的观察,问题的解决方案是配置以下设置:
min_server_memory
(5-10 GB?)根据您的评论:
目前缓存中有大约8-9GB的数据,看起来很稳定。
...以及 Microsoft 建议设置min_server_memory
.
max_server_memory
(20-32 GB) 根据您的观察:
看来20GB对于这个盒子的工作负载来说已经足够了。我很高兴暂时保留 32GB,但我真的很想深入了解这一点,以便我可以更好地配置 VM/SQL。
...以及 Microsoft 建议设置max_server_memory
.
仅在必要时才应设置此选项,即如果有迹象表明 sqlservr 进程正在被调出。
拥有虚拟化环境的(其中一个)好处是资源可以/应该共享,甚至可能过度使用。但是,如果您的硬件托管多个实例,则打开内存中的锁定页 (LPIM) 可能会对您的 Hyper-V 环境产生负面影响。过度使用 RAM 可能会耗尽其他实例。
在考虑切换所有控制杆之前,请从设置 1. 和 2. 开始,如果微调这些内存设置不起作用,那么如果您有足够的硬件,请考虑打开 LPIM 。
归档时间: |
|
查看次数: |
498 次 |
最近记录: |