鎖使用的記憶體
我有點好奇,具有 128 GB 數據庫 RAM 大小的 SQL 2012 企業版之一是 370 GB 並且還在增長,鎖 (OBJECTSTORE_LOCK_Manager) 記憶體管理員使用的記憶體量顯示為 7466016 KB。我還可以通過查看 perf counter 來確認
select * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)'
但是,當我執行查詢
select count(*) from sys.dm_tran_locks
它僅顯示 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 工作負載會很重。