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 / 问题 / 337720
Accepted
Martin Karouš
Martin Karouš
Asked: 2024-03-14 17:07:18 +0800 CST2024-03-14 17:07:18 +0800 CST 2024-03-14 17:07:18 +0800 CST

MS SQL Server - 高“修改内存”消耗

  • 772

我们在 Windows Server 2022(具有 32GB RAM 的虚拟机)上运行 MS SQL Server 2022(标准版 16.0.4095.4)的实例,并遇到 sqlservr.exe 进程消耗的“修改内存”问题。

SQL Server内存配置如下:

SQL Server 内存配置

总体内存消耗如下所示:

总体内存消耗

当我查看什么消耗了修改后的内存时,我可以看到它是 SQL Server:

RAM映射输出

内存的“修改”部分不断增长,并且似乎永远不会下降(它已经连续几天保持在较高水平)。SQL Server 性能统计信息目前并未表明存在任何性能问题。

此外,DBCC MEMORYSTATUS 的输出没有给我任何关于这个“修改的内存”部分可能是什么的线索。据我了解输出(见下文),DBCC MEMORYSTATUS 报告的内存消耗符合“最大服务器内存”中设置的限制。

DBCC 内存状态输出

您是否知道什么可能导致内存消耗远高于“最大服务器内存”中设置的值,或者我如何进一步调查?

我们拥有的任何其他实例上都不会出现此问题 - “修改的内存”只是内存消耗的一小部分。此实例与其他实例之间的唯一区别在于,此框中有几个基本可用性组设置。那里不允许任何其他“可疑功能”(没有列存储索引,没有内存中 OLPT ...)。

我只是出于好奇而尝试减少“最大服务器内存”值。唯一的影响是,由此释放的“正在使用的内存”在一段时间内缓慢但肯定地切换到了“修改的内存”。我正在考虑增加虚拟机内存,但我担心这可能会导致更大的“修改内存”消耗......

sql-server
  • 2 2 个回答
  • 133 Views

2 个回答

  • Voted
  1. Sean Gallardy
    2024-03-15T23:07:56+08:002024-03-15T23:07:56+08:00

    [...] sqlservr.exe 进程消耗的“修改内存”有问题

    我想知道/理解的是到底是什么消耗了这个“修改过的内存”

    修改的内存实质上是已经被修改的内存,必须先写入磁盘才能重新使用。SQL Server 有一个缓冲池(以及各种其他内部和外部内存项),其工作是按字面意思读取和写入数据。为此,SQL Server 将数据缓存在内存中。SQL Server 将修改大量内存。您可以随意使用 etw 跟踪来查找内存更改,转储这些页面并查看修改的内容,但这毫无意义。让我给你答案,有人运行了一个查询,它需要数据或对数据进行了更改,内存被修改了。对于已配置的服务器(以及正在运行的其他所有内容)来说,最大服务器内存设置得太高,现在您会看到修改后的内存计数器。

    现在您已经有了答案,这有什么帮助?正如我所说,它不会。

    你有一个 XY 问题。你专注于错误的事情并且不会放手。是时候放手了,看看森林,停止违背你所寻求帮助的人告诉你的事情。

    除了我给出的链接之外,这里还有许多资源解释最大服务器内存:

    • SQL Server 内存分配和最大服务器内存设置
    • 为什么 SQL Server 不使用最大服务器内存设置?
    • 共享内存连接占用的 RAM 是否计入最大服务器内存?
    • 已配置最大服务器内存,但增加了更多配置
    • https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/server-memory-server-configuration-options?view=sql-server-ver16

    从您自己的屏幕截图来看,最大服务器内存是按照配置的。

    在此输入图像描述 在此输入图像描述

    正如我所说,假设 SQL 将仅使用20 GB ,这是不正确的。图像、线程堆栈、堆分配和一大堆其他内容不属于最大服务器内存范围,就像我之前给您的链接中所述。你备份吗?很酷,外面也一样。我看到 SQL 代理正在运行,您考虑到了吗?SSMS 也在运行,那怎么样?我看到很多第 3 方项目,所有内存也都被占用了吗?线程堆栈、图像、第 3 方 dll 及其堆分配等都包含在这分配的神奇 32 GB 内存中?

    在此输入图像描述

    将最大服务器内存设置得较低,删除任何第一方或第三方 dll(链接服务器等),并且不要在服务器上运行大量其他内容。

    请让修改内存的事情过去吧,正如我之前所说,它在这种情况下毫无用处。

    • 3
  2. Best Answer
    Martin Karouš
    2024-04-19T19:41:46+08:002024-04-19T19:41:46+08:00

    尽管对此感到沮丧,并且由于我不认为 sqlsvr.exe 锁定的不断增加的“修改内存”量是标准且健康的行为,我继续调查并最终找到了我们环境中问题的根本原因。

    简单回顾一下一开始的环境和问题:

    • WFCS 中的 2 个 Windows 2022 服务器,采用 MS SQL 2022 标准版 (16.0.4095.4),32GB RAM
    • 总共 20 个数据库,每个数据库都位于一个基本可用性组中。
    • 所有数据库的总大小为 46 GB。
    • 无论当前工作负载如何,sqlsvr.exe 锁定的“修改内存”量都在持续增长并且从未下降。即使在服务器闲置的几个小时后也是如此。
    • 多次虚拟机重新启动后遇到相同的行为。
    • 我们运行的所有其他 SQL Server(超过 100 个)都没有这样的行为。在所有这些上,消耗的“修改内存”量始终可以忽略不计(以 MB 为单位)。
    • “修改的内存”部分显示在 Windows 资源监视器(或 RAM 映射等实用程序)中,由 sqlsrv.exe 进程锁定,但根据 DBCC MEMORYSTATUS 的输出,任何内存管理员都不会消耗该部分。
    • “修改的内存”正在增加,但代价是剩余的可用 VM 内存以及内存管理员分配(直到达到“最小服务器内存”配置值)。迟早我们总是会达到服务器内存利用率的 99%,并且虚拟机开始变得无响应。

    当我们不是从其所属进程的角度而是从文件的角度查看“修改的内存”时,我们发现增加的分配似乎保存在 WFCS 事件日志文件中,如下所示:

    在此输入图像描述

    尽管 ClusterLogLevel 设置为 3,但仍以高节奏生成大量“详细级别”事件。

    在此输入图像描述

    曾有过这样的事件:

    在此输入图像描述 在此输入图像描述

    经过多次尝试,我们无法强制不记录详细级别的事件。

    最后,我们决定禁用 Windows 事件日志中的整个 FailoverClustering 日志。从那时起,内存消耗就以“正常方式”运行,消耗的“修改内存”量可以忽略不计,正如我们在其他服务器中所习惯的那样。

    问题似乎出在 WFCS 和服务器上的 AG 数量中,因为原则上 AG 的数量是该环境(2 个服务器)与我们运营的所有其他环境不同的唯一方面。

    • 1

相关问题

  • 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