AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 115136
Accepted
Vaccano
Vaccano
Asked: 2015-09-16 11:53:39 +0800 CST2015-09-16 11:53:39 +0800 CST 2015-09-16 11:53:39 +0800 CST

缓冲区大小改变?

  • 772

我有一个生产数据库,该数据库遇到页面预期寿命 (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)
sql-server sql-server-2012
  • 2 2 个回答
  • 2973 Views

2 个回答

  • Voted
  1. Best Answer
    Shanky
    2015-09-24T01:28:08+08:002015-09-24T01:28:08+08:00

    问:我的生产数据库遇到页面预期寿命 (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 Bug 修复详细信息

    您可能会在 SQL Server 2012 中遇到性能下降的问题。当您检查 SQL Server 性能监视器工具时,您会看到以下内容:

    • SQLServer:缓冲区管理器\页面预期寿命性能计数器值快速下降。发生此问题时,计数器接近 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 中将具有此权限。

    笔记:

    1. 这是一种解决方法。这里的解决方案是找出对 VM 机器造成压力的原因。你应该解决这个问题。如果您觉得Wmware Balooning是问题所在。您可以使用RAMMAP 工具来跟踪Locked Driver. 在 RAMMAP 工具中,如果您看到 Locked 驱动程序占用大量内存,则表明它是 VMware balooning。从团队那里获得帮助,为运行 SQL Server 的虚拟机配置/禁用气球

    2. 在提供 LPIM 之前,您必须确保已为最大服务器内存设置了最佳值,并为操作系统留下了足够的内存以高效执行。

    3. 如果您不遵循以上两点,并且由于 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。这不是一个正确的方法。

    • 5
  2. Erik
    2015-09-23T20:07:17+08:002015-09-23T20:07:17+08:00

    这是一个集体努力,我的角色主要是作为策展人。


    您可能会看到您所看到的结果的原因有很多。

    Zane在评论时提出了一些潜在的原因:

    虚拟机是否在内存上过度使用?其他活动是否在此期间达到峰值,因此 Windows 必须从 SQL Server 取回内存?在高负载时间会发生这种情况吗?这台机器上运行的其他进程是什么?

    Tom V在他的评论中还提供了一些潜在的原因:

    你当时有索引维护吗?如果您认为这是 vmware 问题,您是否可以访问 vmware 控制台?如果是这样,气球状态是什么?MCTLSZ 在 esxtop 中说了什么?

    swasheck 也提到了调查工作量的重要性:

    除了正确提出的 vmware 影响之外,您还没有告诉我们有关您的工作负载的任何信息,这意味着您是否正在重建索引、写入页面等。

    由于虚拟机/内存压力似乎是一个可能的问题,您应该向系统管理员询问一些基本问题。

    以非指责的方式提出的一些建议问题包括:

    • 询问系统管理员是否为您的 VM 分配了固定或动态内存。-亚伦伯特兰
    • 如果他们正在膨胀或过度分配[内存]。-赞恩

    您似乎也混淆了 PLE 和内存中的缓冲区页数

    几个人提到了这个问题,包括最初的swasheck和Max Vernon,他说:

    正如@swasheck 所说,您在问题中引用的数字不是 PLE。它们是内存中的缓冲区页数。PLE 是“Page Life Expectancy”,它可以上升或下降,而内存中的缓冲页数没有任何变化。PLE 衡量平均数据页在内存中的停留时间。我已经看到服务器从数万到 0 波动,而内存中分配的页数没有任何损失。如果 PLE 确实很低,则表明与缓冲区页数意外减少完全不同的问题。

    Zane澄清了 PLE 的作用,他说:

    是的,这里使用 PLE 的问题是它并不表示缓冲池可用的内存实际丢失。它更多地是关于衡量页面被刷新为新数据让路的频率。

    检查内存问题的更好选择

    Max Vernon建议使用以下查询:

    SELECT * FROM sys.dm_os_sys_memory ORDER BY system_memory_state_desc
    

    Kin还建议:

    System_health_session 将为您提供清晰的图片,如果它是内存不足的内部或外部内存压力通知。

    这是一个可以在后台运行而不影响性能的扩展事件。

    • 4

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve