SQL Server Sleeping會話佔用內存資源淺析?

 

在SQL Server中,會話的狀態有運行(Running)、睡眠(Sleeping)、休眠(Dormant)、Preconnect 等狀態,有時候你會在數據庫中看到不少會話處於睡眠(Sleeping)狀態,那麼這些睡眠(Sleeping)狀態的會話會消耗CPU、Memory資源嗎?若是消耗資源的話,那麼sleeping會話具體消耗多少內存資源呢? 另外它會影響數據庫性能嗎?sql

 

首先,處於睡眠(Sleeping)狀態的會話意味着當前沒有運行任何請求。這樣也意味着這種狀態的會話是不會消耗CPU資源的,那麼它是否消耗內存資源呢?答案是會,它會保留了必定數量的內存,用於保存與會話相關的結構。 這包括會話上下文等信息, 關於每一個處於睡眠狀態會話消耗的內存具體大小,可使用下面腳本查看睡眠(Sleeping)狀態會話消耗的內存(不肯定其值的準確性,文末有介紹):數據庫

 

 

SELECT 
      s.session_id
    , s.status
    , s.last_request_start_time
    , s.memory_usage*8 AS memory_usage_kb
    , t.task_state
    , s.host_name
    , s.program_name
    , s.transaction_isolation_level
    --, s.open_transaction_count
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s ON
    s.session_id = c.session_id
LEFT JOIN sys.dm_os_tasks AS t ON
    t.session_id = s.session_id
WHERE s.status='sleeping'
ORDER BY
     s.memory_usage DESC;

 

 

clip_image001

 

clip_image002

 

 

使用這個這個腳本查出,發現處於睡眠(Sleeping)狀態會話消耗的內存有不少狀況: 0KB、16KB、24KB、32KB、40KB、.....216KB.  彷佛沒有什麼規律,固然以32KB、40KB居多。官方文檔關於這方面的介紹幾乎沒有,僅僅在Memory Used by SQL Server Objects Specifications中有部分介紹,以下所示:網絡

 

下表列出 SQL Server 中不一樣對象所用內存的大體數值。列出的數值爲估計值,具體取決於環境和建立對象的方式。SQL Server 2005 管理某些項的方式與早期版本存在顯著差別。session

 

 

SQL Server 2000app

SQL Server 2005sqlserver

SQL Server 2008性能

測試

每一個全部者 64 字節 + 32 字節this

每一個全部者 64 字節 + 32 字節spa

每一個全部者 64 字節 + 32 字節

打開的數據庫

每一個文件 3924 字節 + 1640 字節,每一個文件組 336 字節

不適用於 SQL Server 2005

不適用於 SQL Server 2008

打開的對象

對象中每一個打開的索引 256 字節 + 1724 字節

不適用於 SQL Server 2005

不適用於 SQL Server 2008

用戶鏈接

12 KB + (3 * network_packet_size)

約爲 (3 * network_packet_size + 94 KB)

約爲 (3 * network_packet_size + 94 KB)

 

網絡數據包大小是表格格式數據流 (TDS) 數據包的大小,該數據包用於應用程序和 SQL Server 數據庫引擎之間的通訊。默認的數據包大小爲 4 KB,由網絡數據包大小配置選項控制。

啓用多個活動的結果集時,用戶鏈接約爲 (3 + 3 * num_logical_connections) * network_packet_size + 94 KB

 

 

 

 

可是在SQL Server 2008以後的文檔,沒有看到這方面內容的介紹。在SQL Server 200五、SQL Server 2008數據庫中測試發現(使用最上面的腳本)memory_usage大小爲16KB、24KB,遠小於94KB,這個文檔和測試結果也一度讓我懷疑sys.dm_exec_sessions這個DMV視圖中memory_usage字段計算Sleeping會話消耗內存的準確性。很遺憾,官方資料關於memory_usage的介紹僅爲:Number of 8-KB pages of memory used by this session. Is not nullable. 不過,有點能夠確認的是:Sleeping狀態的會話消耗的內存資源真的不多。基本上對數據庫性能影響很小。

 

 

參考資料:

 

https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/aa337559(v=sql.105)

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/62d19c9e-7ccb-4e1b-a18f-f249c23f0376/sleeping-spids-consume-cpu-and-memory-?forum=sqlgetstarted

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-sessions-transact-sql?view=sql-server-2017

相關文章
相關標籤/搜索