SQL Server架构----SQL Server的执行模式和SQLOS
2013-12-31 10:00:22 burgess_liu 阅读数 1941更多
分类专栏: SQL Server 2012的内部原理和故障排除
SQLOS是SQL Server体系结构的核心,因此,你需要理解为何会存在它、以及SQL Server工作时它做什么。
总之,SQLOS是位于SQL Server 和 WIndows之间的用户模式层。它用来做低级操作,诸如调度、I/O完成、内存管理和资源管理。为了探究究竟这是什么意思,为何需要它,你首先要理解SQL Server的执行模式。
执行模式
当一个应用程式认证到SQL Server,它在对话的上下文中建立一条连接,这由一个session_id标识。
你可以通过查询sys.dm_exec_sessions看到所有认证的对话清单。
在一个对话里,当一个执行请求做出时,为了持续,SQL Server会把工作分成一个或多个任务,然后为每个任务关联一个工作者线程。
每个线程可以是下面三种状态之一:
Running----处理器在一次仅能执行一件事情,当前正在处理器上执行的线程将有一个running状态。
Suspended----SQL Server有一个合作调度者,因此,正在运行的线程会屈服于处理器,在它们等待资源时变成暂停(suspended),这就是我们说的等待。
Runnable----当一个线程完成等待时,它会变成可运行状态,这就意味着它准备好了再次执行,这被称为信号等待。
如果没有可用的工作线程,并且尚未达到max worker threads,那么SQL Server会分配一个新的工作线程。如果达到最大的工作线程数,那么任务就会等待,直到一个线程变成可用,这个等待的类型是THREADPOOL。
默认的最大工作线程数是基于CPU架构和逻辑处理器的数量:
32位OS: Max Worker Threads=256 (逻辑CPU<=4) Max Worker Threads=256 +((逻辑CPU数-4)*8) (逻辑CPU>4)
64位OS: Max Worker Threads=512 (逻辑CPU<=4) Max Worker Threads=512 +((逻辑CPU数-4)*16) (逻辑CPU>4)
你也可以通过执行如下语句来获取最大工作线程数:SELECT max_workers_count FROM sys.dm_os_sys_info
用完工作线程通常是大量并发的并行执行计划引起,它甚至表明服务器的性能达到极限,你需要添加处理器。
每个工作线程需要2M(64位)或0.5M(32位)的RAM,因此,SQL Server仅仅在需要它们的时候创建线程,而不是一次性创建所有。
你可以查看SQL Server当前有多少线程:
SELECT count(*) FROM sys.dm_os_workers
调度器
每个线程有个关联的调度器,调度器为处理器上它的每个线程调度时间。SQL Server的调度器数量=SQL Server用的逻辑处理器的数量+专用管理员连接(DAC)。你可以通过sys.dm_os_schedulers查看调度器的相关信息,通过SELECT cpu_count,scheduler_count,scheduler_total_count FROM SYS.dm_os_sys_info可以查看CPU数、调度数。
下图显示了对话、任务、线程、调度器与CPU之间的关系:
SQLOS
SQLOS产生的背景是为了整合资源,提升性能。另外,你可以通过sys.dm_os_打头的DMV来查看SQLOS的信息。对于体系结构中的各个组件,SQLOS起到支持它们的角色的作用。
关于SQL SERVER SQLOS的任务调度,你可以参考http://blogs.msdn.com/b/apgcdsd/archive/2011/11/24/sql-server-sqlos.aspx。