Vac*_*ano 6 sql-server sql-server-2012 page-life-expectancy buffer-pool
我有一个生产数据库,它遇到了剧烈波动的页面预期寿命 (PLE) 问题。(它在随机时间崩溃为零。)
我一直在研究 PLE 问题,并发现一些似乎指向 VMWare 问题的内容,但我不确定我是否正确使用了数据。似乎我正在丢失缓冲区/缓存页面。
我正在使用这个查询:
SELECT COUNT(*) AS cached_pages_count,
CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE DB_NAME(database_id)
END AS database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id), database_id
ORDER BY cached_pages_count DESC;
Run Code Online (Sandbox Code Playgroud)
(在这里找到)
我正在计算 PLE 崩溃前后的结果(计数)。一个例子是之前的 1,097,820 和之后的 131,394。所以我似乎“丢失”了 966,426 页。
我的猜测是所有虚拟机的硬件都处于压力之下,因此它会随机从服务器中交换一些内存一段时间。(这只是一个猜测。)当这种情况发生时,所有页面都丢失了,因此 PLE 直线下降。
那么,我sys.dm_os_buffer_descriptors是否正确使用了视图? 从我读到的它总是显示使用过的缓冲区/缓存页面。所以如果它是空的(或显着减少),我要么不再有内存,要么是空的。(我很想用一种方法来证实这个结论。)
或者还有另一种解释为什么计数下降这么多?
我们的系统管理员管理虚拟机。我希望在使用这些数据去找他们之前了解我的查询。从数据库的角度来看,PLE 崩溃的时间似乎是随机的。(在 PLE 崩溃期间不会发生重新索引或其他高性能的事情)
我做了大量的工作,看看它是否与工作负载有关。虽然存在一个性能不佳的查询,但用完所有缓存还不够。[没有] 当缓冲区计数下降时,服务器上没有重建或其他非常规用户活动。即使是这样,我也不会在上面的查询中看到使用它吗?(意味着如果它是 SQL Server 操作,计数不会保持不变,只是内容不同吗?)
我无权访问 VMWare 设置。我希望在涉及那些做的事情之前更好地理解我的发现。这个问题的重点是确保我首先正确使用视图。
在评论链的末尾:
我试图说 PLE 问题导致我丢失了缓冲页面问题。我用来获取 PLE 的查询将显示低 PLE,因为页面正在丢失。所以他们身上的东西消失了。这是一个错误的读数,因为内存量减少了。
这是我的@@Version:
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
Dec 28 2012 20:23:12
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)
问:我有一个生产数据库,它遇到了页面预期寿命 (PLE) 问题的剧烈波动。(它在随机时间崩溃为零。)
让我问你什么是输出Select @@Version。您的 SQL Server 修补到的 SP 和 CU 级别是什么。我问这个的原因是因为 SQl Server 2012 中存在一个错误,它迫使 PLE 像您所观察到的那样直线下降。此错误已在SQL Server 2012 SP1 CU4 中修复。或者更安全地说,我建议您应用SQL Server 2012 SP2而不是 CU4
它有时正常的PLE波动于具有高活性的系统。实际上,这正是 PLE 代码在 SQL Server 中的工作方式。但是它经常暴跌到零的事实让我相信你可能会遇到我上面提到的错误。
根据 Microsoft 错误修复详细信息
您可能会在 SQL Server 2012 中遇到性能下降的问题。当您检查 SQL Server 性能监视器工具时,您会看到以下内容:
• SQLServer:Buffer Manager\Page life expectancy 性能计数器值的快速下降。发生此问题时,计数器接近 0。
系统上的 PLE 衡量您的缓冲池的不稳定程度,它也衡量您的 SQL Server 中的 I/O 活动量。MSDN 说
页面预期寿命 - 表示页面在没有引用的情况下将在缓冲池中停留的秒数
相信我这个定义是不完整的。它以时间的形式描述它,这不是一个完整的定义。我一直注意到它是服务器上 I/O 活动的度量。I/O 活动越大,BPool 就越不稳定,从而使 PLE 波动。
问:我的猜测是所有虚拟机的硬件都处于压力之下,所以它会随机从服务器上交换一些内存一段时间。
如果您认为是这种情况并且您不希望 SQL Server 成为此类问题的受害者,则必须确保 SQL Server 服务帐户具有内存特权中的锁定页面 (LPIM)。这不会让操作系统强制 SQL Server 分页出其内存。如果运行 SQL 服务的帐户默认为本地系统,则 SQL Server 在 SQL Server 2012 中将拥有此权限。
笔记:
这是一种解决方法。这里的解决方案是找出对 VM 机器造成压力的原因。你应该解决这个问题。如果您觉得Wmware Balooning是问题所在。您可以使用RAMMAP 工具来跟踪Locked Driver. 在 RAMMAP 工具中,如果您看到 Locked driver 占用大量内存,这是 VMware 气球膨胀的迹象。向团队寻求帮助,为运行 SQL Server 的虚拟机配置/禁用膨胀
如果您不遵循以上两点,并且如果操作系统由于 LPIM 而面临严重的内存压力,操作系统进程将被调出,因为它无法强制 SQL Server 释放内存(由于 LPIM 导致其锁定/不可分页),从而导致非常缓慢操作系统进程。
问:那么,我是否正确使用了 sys.dm_os_buffer_descriptors 视图?从我读到的内容来看,它总是显示使用过的缓冲区/缓存页面。所以如果它是空的(或显着减少),我要么不再有内存,要么是空的。(我很想用一种方法来证实这个结论。)
已经提到的缓冲区描述符返回有关当前在 SQL Server 缓冲池中的所有数据页的信息。恕我直言缓冲页are affected by I/O activity on server and thus indirectly related to PLE。如果请求从磁盘到内存中获取大量页面,如果 SQL Server 发现需要在缓冲池中创建空间以将新页面引入内存,从而减少内存中的页面数量,则它很可能会将数据页刷新到磁盘。内存中存在特定数据库的数据页。
因此,您通过 sys.dm_os_buffer_descriptors 看到的内容并不正确,但我希望not suggest您使用缓冲区描述符 DMV 来衡量服务器上的 PLE。这不是正确的方法。