我们已启用 sp_configure 'tempdb metadata memory-optimized' = 1,现在 tempdb 元数据在我们的一台服务器上占用了 400 GB 以上,并且还在继续增长。内存使用量有所下降,但通常它的内存使用量会不断增加。我们已经有几次服务器实际上崩溃了,因为其他系统进程没有足够的内存来修改 tempdb,这导致整个服务器宕机。
如何防止 SQL Server 内存中优化的 tempdb 元数据不断增长并使我的服务器崩溃?如果有的话,我可以查看哪些其他信息来找到消耗如此多内存的内容?
以下查询当前返回 438 GB。
SELECT SUM(domc.pages_kb / 1024.0 / 1024.0) AS pages_gb
FROM sys.dm_os_memory_clerks AS domc
WHERE domc.type LIKE 'MEMORYCLERK_XTP'
Run Code Online (Sandbox Code Playgroud)
以下查询提供的数据是内存的最大使用量(290 GB)是 memory_consumer_id 为 113 - 'LOB Page Allocator'。它没有object_id 或xtp_object_id,所以我猜它是一个数据库范围的对象。
SELECT ddxmc.memory_consumer_id
, ddxmc.memory_consumer_type_desc
, ddxmc.memory_consumer_desc
, ddxmc.object_id
, ddxmc.xtp_object_id
, ddxmc.used_bytes / 1024.0 / 1024.0 / 1024.0 AS used_gb
FROM sys.dm_db_xtp_memory_consumers AS ddxmc
ORDER BY ddxmc.allocated_bytes …
Run Code Online (Sandbox Code Playgroud) sql-server memory tempdb memory-optimized-tables sql-server-2019
我的问题是,对于具有 TB 级 RAM 的实例,SQL Server 需要很长时间来增加它的内存使用量,同时我们会间歇性地等待 MEMORY_ALLOCATION_EXT,这会减慢我们的处理速度,直到 SQL Server 达到其最大内存。
我们有 SQL Server 2019 企业版的故障转移群集实例 (FCI),节点上有数 TB 的内存。在通常的用例中,我们只允许每个节点有 1 个 SQL Server 实例,因此我们将最大服务器内存设置为接近节点内存的 85%,但我们也将最小服务器内存设置得相对较低,以防 SQL Server 发生故障到另一个节点,并且需要在减少内存占用的情况下联机才能跛行。
有没有其他方法可以强制 SQL Server 快速增加其内存使用量?
在我们的 SQL Server 实例之一(如果您确实需要知道,则为 12.0.5571.0)上,我们使用多个 IP 地址进行连接。
我一直在玩 puppet 并且一直在搞乱注册表设置
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.InstanceNameX\MSSQLServer\SuperSocketNetLib\Tcp
Run Code Online (Sandbox Code Playgroud)
看看我是否可以使用 puppet 来自动配置 IP 地址和端口分配。我创建了一个名为“IP172016000006”的新注册表路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.InstanceNameX\MSSQLServer\SuperSocketNetLib\Tcp\IP172016000006
Run Code Online (Sandbox Code Playgroud)
我从中模板化
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.InstanceNameX\MSSQLServer\SuperSocketNetLib\Tcp\IP1
Run Code Online (Sandbox Code Playgroud)
但是现在每当我启动 SQL Server 实例时,127.0.0.1 和 172.16.0.5 的动态端口都不同。
比如我会停止SQL Server的实例,进入
重新启动 SQL Server 后,该实例将侦听 127.0.0.1:43340 和 172.16.0.5:43341(似乎总是比另一个端口多 1) …