欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL Server Sleeping会话占用内存资源浅析?

程序员文章站 2022-03-22 14:51:50
在SQL Server中,会话的状态有运行(Running)、睡眠(Sleeping)、休眠(Dormant)、Preconnect 等状态,有时候你会在数据库中看到很多会话处于睡眠(Sleeping)状态,那么这些睡眠(Sleeping)状态的会话会消耗CPU、Memory资源吗?如果消耗资源的话... ......

 

在sql server中,会话的状态有运行(running)、睡眠(sleeping)、休眠(dormant)、preconnect 等状态,有时候你会在数据库中看到很多会话处于睡眠(sleeping)状态,那么这些睡眠(sleeping)状态的会话会消耗cpu、memory资源吗?如果消耗资源的话,那么sleeping会话具体消耗多少内存资源呢? 另外它会影响数据库性能吗?

 

首先,处于睡眠(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;

 

 

 

 

 

使用这个这个脚本查出,发现处于睡眠(sleeping)状态会话消耗的内存有很多情况: 0kb、16kb、24kb、32kb、40kb、.....216kb.  似乎没有什么规律,当然以32kb、40kb居多。官方文档关于这方面的介绍几乎没有,仅仅在memory used by sql server objects specifications中有部分介绍,如下所示:

 

下表列出 sql server 中不同对象所用内存的大致数值。列出的数值为估计值,具体取决于环境和创建对象的方式。sql server 2005 管理某些项的方式与早期版本存在显著差异。

 

 

sql server 2000

sql server 2005

sql server 2008

每个所有者 64 字节 + 32 字节

每个所有者 64 字节 + 32 字节

每个所有者 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 2005、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