SQL*_*ner 10 sql-server-2008 sql-server memory sql-server-2008-r2 sql-server-2012
我有点好奇,具有 128 GB 数据库 RAM 大小的 SQL 2012 企业版之一是 370 GB 并且还在增长,锁 (OBJECTSTORE_LOCK_Manager) 内存管理员使用的内存量显示为 7466016 KB。我也可以通过查看性能计数器来确认select * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)'
但是,当我运行查询时
select count(*) from sys.dm_tran_locks
Run Code Online (Sandbox Code Playgroud)
它只显示了 16 个锁。那么什么是使用超过 7 GB 的锁。有办法查到吗?
这是否意味着一旦分配了锁的内存,SQL 还没有释放它?在过去的 1 小时内,我没有看到锁计数超过 500,但锁内存保持不变。
最大服务器内存为 106 GB,我们没有在内存中使用锁定页面,我在过去 12 小时内没有看到任何内存压力或错误日志中的任何错误。可用 MBytes 计数器显示超过 15 GB 的可用内存。
活动监视器始终显示 0 个等待任务,因此显然没有阻塞。
考虑到 SQL 服务器锁占用大约 100 字节的内存,7 GB 是大量内存,并试图找出谁在使用它。
我通过锁计数运行服务器仪表板报告最高事务,它说“当前系统上没有运行锁定事务。但是,锁内存仍然显示如上所述。数据库在夜间最忙。
锁管理器是一个非常热的关键代码路径(可能是最热的关键代码路径),如果它必须等待每个锁的内存分配,性能就会下降。它可能会分配大内存块并自行管理它们。如果它还保留内存,以便它不会在某些关键代码路径中耗尽内存,我不会感到惊讶。
@RemusRusanu 答案的附录(不适合评论)...
鉴于数据库引擎在升级之前将允许每个对象最多 5000 个锁,并考虑到 Remus 对锁管理器的关键性质的回答,高保留开始看起来似乎有道理:
5000(锁)* 10(表或索引)* 96(每个锁的字节数)* 1000(并发查询)= 4.47GB
我推测保留来自可用 RAM 和当前工作负载的组合,但尚未在任何地方看到它的记录或博客。还可以推测您的 128GB 内存在 2008 年会被认为是慷慨的,而 7GB 的预留表明预计该大小的 OLTP 工作负载很重。