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 / 问题 / 260669
Accepted
DForck42
DForck42
Asked: 2020-02-27 11:52:55 +0800 CST2020-02-27 11:52:55 +0800 CST 2020-02-27 11:52:55 +0800 CST

SQL Server 2016 的奇怪内存压力

  • 772

几个月来,我们一直在与特定服务器上奇怪的内存压力问题作斗争。这是 SentryOne 中最后一个事件的样子:

系统内存

系统内存

SQL Server 内存

SQL Server 内存

内存配置:

  • 服务器总内存 - 96GB
  • 最大服务器内存 - 84GB

这看起来很奇怪的原因是,如果是外部内存压力,我预计系统内存上的其他类别会在此期间增长,但事实并非如此。

我们在此期间看到的部分情况是查询最终会生成错误的计划并最终导致应用程序出现性能问题。从历史上看,在这种情况下运行 DBCC FreeProcCache 可以缓解压力,但我们仍然不知道原因。我认为计划得到一个糟糕的计划是这个问题的症状而不是原因,但我可能错了。

我们为尝试解决此问题所做的事情:

  • 删除了我们认为有问题的 sp 的连接
  • 删除了数据库中的重复记录
  • 服务器内存增加(我认为我们增加了 16-32 GB)
  • 启用内存中的锁定页面

我完全不知道接下来要看什么。我们的架构师认为我们可能需要使用内存来调整一些 VM 设置,但我们还没有做到。

我可以看什么来潜在地解决这个奇怪的内存压力问题?

sql-server sql-server-2016
  • 3 3 个回答
  • 582 Views

3 个回答

  • Voted
  1. Best Answer
    John K. N.
    2020-02-29T06:23:39+08:002020-02-29T06:23:39+08:00

    Jonathan Kehayias 在 SQL SQLSkills.com 上发表了一篇很酷的文章,标题为Wow… 一个错误配置 SQL Server 内存的在线计算器!.

    乔纳森在他的文章中写道:

    我的一般建议是使用我的书《SQL Server 故障排除:意外 DBA 指南》中的计算方法,即为操作系统保留1 GB 的 RAM ,为从 4-16 GB 安装的每 4 GB 的 RAM保留 1 GB ,然后每 8 GB RAM 安装在 16 GB RAM 以上 1 GB。这不是一个过于技术性的计算,但它运行良好,通常会将“最大服务器内存”配置得足够低,以使服务器稳定并具有可靠的性能。

    如果您继续使用此示例,那么您最好将 SQL Server 配置为使用 81 GB 的 max_memory 设置运行。

    您可以使用以下公式和数据创建一个 Excel 以生成一个漂亮的 SQL Server Max Memory 设置小图。

    SQL Server 内存计算的示例数据

    Excel 工作表以HW 内存(A2) 列开头:

    4
    

    第二列OS Reserved (B2) 的 Excel 公式为:

    IF(A2<=16;1 + A2/4;1+4+(A2-16)/8)
    

    SQL 内存列(C2) 为:

    A1-A2
    

    这将产生以下图表:

    SQL Server 内存配置图

    可能的解决方案

    如您所见,如果您有 96 GB 的 RAM,那么您应该为操作系统保留 15 GB 并将 SQL 内存 (max_memory) 设置为 81 GB。

    乔纳森继续在他的文章中解释说......

    SQL Server 具有 SQLOS 的内置组件资源监视器,它监视 QueryMemoryResourceNotification Windows Server API 以获取有关服务器上操作系统级别内存可用性的状态。 如果 Windows 操作系统处于内存压力之下,它将设置一个内存不足通知,资源监视器线程将检测并强制外部时钟在内部处理缓存以开始扫描缓存以清理并减少内存使用量,从而释放进程内存回到操作系统。

    您的操作系统可能没有足够的内存并且正在从 SQL Server 操作系统中占用内存。

    将 max_memory 设置稍微降低到 81 GB 将允许不在 max_memory 设置内运行的操作系统和其他 SQL Server 组件拥有足够的 RAM。

    你的旅费可能会改变

    • 3
  2. rois
    2020-03-02T07:02:06+08:002020-03-02T07:02:06+08:00

    我可能对此有误,但我们还是试试吧。也许它会对你有所帮助。

    从您提供的屏幕截图中,当您开始遇到性能问题时,它似乎是页面预期寿命坦克。我想您当时看到查询有很长的 PAGEIOLATCH_* 等待?您还提到正在生成错误的计划,并且运行 DBCC FREEPROCCACHE 可以暂时解决问题。对我来说,这听起来像是参数嗅探的典型症状。我猜你有一个查询,当使用错误的参数编译时,会进行表扫描而不是搜索,使用错误的索引或查询计划的形状发生变化。通常,这是一个需要大量 I/O 并且使存储子系统饱和的查询,因此即使是进行键查找的简单查询也会变得很慢。当您遇到性能问题时,我会尝试确定它是哪一个并通过仅删除它的计划来确认。

    为了识别有问题的查询,我将只查看那些有很长 PAGEIOLATCH 等待的查询,并在它们快速时比较它们的执行计划。

    要解决它,您需要发挥创造力。您可以尝试添加查询提示,在每次执行时强制重新编译,使用计划指南。我在更改基础表的索引和重写有问题的查询方面也取得了成功。很难提出任何具体的建议,因为您现在的问题是确定是什么导致了您的问题。

    • 2
  3. Andreas Bergdal
    2020-02-29T04:43:31+08:002020-02-29T04:43:31+08:00

    在运行夜间 SSIS 作业时,我看到过类似的问题,有时 SSIS 内存使用情况对于 Sentryone 来说是不可见的,无论出于何种原因。我会查看 S1 中的事件日历,看看当时正在运行哪些作业。

    • 0

相关问题

  • 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