1

我在用着

Microsoft SQL Server Enterprise:基于内核的许可(64 位)版本 12.0.4100.1

我有一个代码,它创建了许多非持久内存优化表,将它们用于某些事情,并在不再需要它们时删除它们。

但是,似乎删除的表仍在消耗 RAM,因为如果我运行

SELECT pool_id, Name, min_memory_percent, max_memory_percent, max_memory_kb/1024 AS max_memory_mb, 
    used_memory_kb/1024 AS used_memory_mb, target_memory_kb/1024 AS target_memory_mb  
FROM sys.dm_resource_governor_resource_pools 
WHERE Name='InMemoryObjects'

我得到以下信息:

pool_id  Name                min_memory_percent max_memory_percent  max_memory_mb   used_memory_mb  target_memory_mb
256      InMemoryObjects     50                 50                  380003          233239          380003

请注意“used_memory_mb”列的高度。在我运行此程序时,服务器中没有内存优化表,所以我认为它必须是来自已删除内存优化表的数据,但仍以某种方式占用 RAM。

同样,当我跑步时

SELECT type, name, memory_node_id, pages_kb/1024 AS pages_MB   
FROM sys.dm_os_memory_clerks WHERE type LIKE '%xtp%'

我得到以下输出:

type            name        memory_node_id  pages_MB
MEMORYCLERK_XTP Default     0               1055
MEMORYCLERK_XTP DB_ID_19    0               6
MEMORYCLERK_XTP DB_ID_33    0               6
MEMORYCLERK_XTP DB_ID_41    0               56
MEMORYCLERK_XTP DB_ID_47    0               0
MEMORYCLERK_XTP DB_ID_32    0               233240
MEMORYCLERK_XTP Default     1               0
MEMORYCLERK_XTP Default     64              0

看看 DB_ID_32 是如何占用相同的 ~240gb 内存的?

我需要一些方法来清除它。当我运行多个代码实例时,我收到错误“资源池 'InMemoryObjects' 中的系统内存不足,无法运行此查询”。所以我认为这个内存实际上必须被捆绑起来,并且当它充满时不会释放自己。资源池“InMemoryObjects”仅针对这一代码创建,除了该代码创建(并随后丢弃)的对象之外,整个服务器中没有其他内存优化对象。它创建的内存优化表都相当小(每张几 GB)。

我知道垃圾收集器应该每分钟运行一次,但是自从数据库中存在任何内存优化表以来已经过去了一天,并且使用的内存根本没有减少。我尝试过强制垃圾收集、检查点、重置统计信息等,但无法取回这些内存。

我发现唯一可行的方法是将整个数据库脱机并重新联机。但是我真的不能每次运行代码时都这样做,所以我需要一个更好的解决方案。

任何想法将不胜感激。谢谢!

4

1 回答 1

0

我想这可能是一个原因。但我很惊讶强制垃圾收集没有捡起它。来自内存垃圾收集的 MSDN 文档:

用户事务提交后,它会识别与其运行的调度程序关联的所有排队项目,然后释放内存。如果调度器上的垃圾回收队列为空,它会搜索当前 NUMA 节点中的任何非空队列。如果事务活动低并且存在内存压力,则主垃圾收集线程可以访问任何队列中的垃圾收集行。如果(例如)删除大量行后没有事务活动并且没有内存压力,则在事务活动恢复或存在内存压力之前,不会对删除的行进行垃圾回收。

https://msdn.microsoft.com/en-us/library/dn643768.aspx

可以尝试文件流垃圾收集吗?我想我在某处读到数据库必须具有的内存优化文件组使用文件流技术。不要引用我的话。

于 2017-03-06T20:06:26.433 回答