我有一个生产数据库,该数据库遇到页面预期寿命 (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;
(在这里找到)
我正在汇总我的 PLE 崩溃前后的结果(计数)。一个例子是之前的 1,097,820 和之后的 131,394。所以我似乎“丢失”了 966,426 页。
我的猜测是所有虚拟机的硬件都处于压力之下,所以它会在一段时间内随机从服务器换出一些内存。(这只是一个猜测。)当这种情况发生时,所有页面都丢失了,所以 PLE 直线下降。
那么,我sys.dm_os_buffer_descriptors
是否正确使用了视图? 从我阅读的内容来看,它总是显示使用过的缓冲区/缓存页面。因此,如果它是空的(或显着减少),我要么不再有内存,要么它是空的。(我很想用一种方法来证实这个结论。)
或者还有其他解释为什么计数下降这么多?
该行下方的信息是从 OP 的评论中添加的
我们的系统管理员管理虚拟机。我希望在我带着这些数据去找他们之前了解我的查询。从数据库的角度来看,PLE 崩溃的时间似乎是随机的。(在 PLE 崩溃期间不会发生重新索引或其他高性能的事情)
我做了很多工作,看看它是否与工作量有关。虽然有一个性能不佳的查询,但用完所有缓存是不够的。当缓冲区计数下降时,服务器上没有重建或其他非常规用户活动。即使是这样,我会不会在上面的查询中看到它被使用?(意思是如果它是一个 SQL Server 操作,计数不会保持不变,只是使用不同的东西吗?)
我无权访问 VMWare 设置。我希望在让那些这样做的人参与之前更好地理解我的发现。这个问题的重点是确保我首先正确使用视图。
在评论链的末尾:
我想说的是 PLE 问题导致我丢失了 Buffer Pages 问题。我用来获取 PLE 的查询将显示低 PLE,因为页面丢失了。所以他们里面的东西都没有了。这是一个错误的读数,因为内存量减少了。
这是我的@@版本:
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)
让我问你什么是输出
Select @@Version
。您的 SQL Server 修补到的 SP 和 CU 级别是什么。我问这个的原因是因为 SQl Server 2012 中有一个错误,它迫使 PLE 像你所观察到的那样直线下降。此错误已在SQL Server 2012 SP1 CU4中修复。或者更安全地说,我建议您应用SQL Server 2012 SP2而不是 CU4PLE 在具有高活性的系统上波动有时是正常的。实际上,这正是 PLE 代码在 SQL Server 中的工作方式。但它经常下降到零的事实让我相信你可能遇到了我上面提到的错误。
根据 Microsoft Bug 修复详细信息
系统上的 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 驱动程序占用大量内存,则表明它是 VMware balooning。从团队那里获得帮助,为运行 SQL Server 的虚拟机配置/禁用气球在提供 LPIM 之前,您必须确保已为最大服务器内存设置了最佳值,并为操作系统留下了足够的内存以高效执行。
如果您不遵循以上两点,并且由于 LPIM 导致操作系统面临严重的内存压力,则操作系统进程将被分页,因为它无法强制 SQL Server 释放内存(由于 LPIM 导致其锁定/不可分页),从而导致极大的缓慢操作系统进程。
如前所述,缓冲区描述符返回有关当前位于 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。这不是一个正确的方法。这是一个集体努力,我的角色主要是作为策展人。
您可能会看到您所看到的结果的原因有很多。
Zane在评论时提出了一些潜在的原因:
Tom V在他的评论中还提供了一些潜在的原因:
swasheck 也提到了调查工作量的重要性:
由于虚拟机/内存压力似乎是一个可能的问题,您应该向系统管理员询问一些基本问题。
以非指责的方式提出的一些建议问题包括:
您似乎也混淆了 PLE 和内存中的缓冲区页数
几个人提到了这个问题,包括最初的swasheck和Max Vernon,他说:
Zane澄清了 PLE 的作用,他说:
检查内存问题的更好选择
Max Vernon建议使用以下查询:
Kin还建议:
这是一个可以在后台运行而不影响性能的扩展事件。