目录
 SQLSERVER独特的任务调度算法"SQLOS"
首页 数据库 mysql教程 SQLSERVER独特的任务调度算法"SQLOS"

SQLSERVER独特的任务调度算法"SQLOS"

Jun 07, 2016 pm 03:45 PM
amp quot sqlserver 任务 独特 算法 调度

SQLSERVER独特的任务调度算法"SQLOS" 微软开发SQLOS 的背景: SQLSERVER作为一个企业级数据库平台,一个基本的要求就是要有能力顺畅地同时处理成百上千的用户请求,SQLSERVER要使线程调度 得更加适应高并发的数据库应用。 由于以上背景: SQLSERVER在Windows

 SQLSERVER独特的任务调度算法"SQLOS"

微软开发SQLOS的背景:

SQLSERVER作为一个企业级数据库平台,一个基本的要求就是要有能力顺畅地同时处理成百上千的用户请求,SQLSERVER要使线程调度

得更加适应高并发的数据库应用。

由于以上背景:
SQLSERVER在Windows的基础上开发出了一套自己的任务调度机制。所以SQLSERVER作为一个应用程序,又抽象出一般由操作系统代为

管理的功能,例如:
任务调度管理子系统
内存管理
错误,异常处理机制
死锁侦测和解决机制
运行第三方代码(dll,extended SP等)机制

 

SQLSERVER的管理功能组件又叫SQLOS SQL OPERATING SYSTEM ,而内存管理和任务调度管理是SQLOS的两大核心内容

对于SQLSERVER来讲,除了从DAC dedicated administrator connection过来的连接,其他用户连接对SQL来讲都是同等重要的,

而这样的连接在同一个时间点,可能会有成百上千。 所以SQLSERVER完全依赖Windows任务调度是不行的。

 

SQLSERVER的这一套任务调度机制的特点:

1、只有需要运行任务的连接才会被分配线程。出于空闲状态的连接,在SQLSERVER里会以一组数据结构表示,所以不会占用线程资源。大大降低

SQLSERVER进程需要的线程数目

2、对于每一个CPU,SQLSERVER内部会有一个调度(scheduler),由这个scheduler决定在某个时间点,到底是哪个SQLSERVER线程去运行。

所以在Windows层面,每个CPU最多只会对应一个处于运行状态的线程。大大降低Windows层面的上下文切换context switch

实践证明:很多有着1000~2000个并发用户的SQLSERVER,线程数也只需要一两百个。SQLSERVER完成的批处理量每秒钟可以达到3000~4000个。

 

SQLOS的几个概念:

 scheduler

对于每个逻辑CPU,SQLSERVER会有一个scheduler与之对应,在SQL层面上代表CPU对象,只有拿到scheduler所有权的任务worker才能在这个逻辑CPU上运行

所谓逻辑CPU,就是SQLSERVER从Windows层面上看到的CPU数目,如果是一个双核的CPU,那么一个物理CPU在SQL看来就是两个逻辑CPU。如果系统还使用了

超线程hyper-threaded ,那对SQLSERVER来讲就是4个逻辑CPU

规则: 每个scheduler上的最大worker数目等于SQLSERVER的最大线程数除以scheduler的数目 ,在同一个时间点,只能有一个拥有scheduler的worker处于运行

状态,其他worker都必须处于等待状态。这样能降低每个逻辑CPU上的处于正在运行状态的线程数目,降低context switch,提供可扩展性

scheduler是SQLSERVER的一个逻辑概念,他不与物理CPU相绑定。也就是说,一个scheduler可以被Windows安排一会儿在这个CPU上,一会儿在那个CPU上。

但是,如果在sp_configure里设置了CPU affinity mask,那么scheduler就会固定在某个特定的CPU上

 

worker

每个worker跟一个线程(或纤程fiber)相对应,是SQLSERVER任务的执行单位。SQLSERVER不直接调度线程/纤程,而是调度worker,使得SQLSERVER能够控制

任务调度

规则: 每个worker会固定代表一个线程(或纤程),并且和一个scheduler相绑定。如果scheduler是固定在某个CPU上的(通过设置CPU affinity mask),那么

worker也会固定在某个CPU上

每个scheduler有worker的上限值,并且可以根据SQLSERVER工作负荷创建或释放worker,每次worker都会去运行一个完整的任务(task)。在任务做完之前不会

退出,除非这个任务主动进入等待状态。

scheduler只在有新任务要运行,而当前没有空闲的worker的情况下,才会创建新的worker。

某个worker空闲超过15分钟,scheduler可能会删除这个worker,以及其对应的线程。当SQLSERVER遇到内存压力的时,也会大量删除处于空闲状态的worker,以

节省multi-page的内存开销

各种CPU和SQLSERVER版本组合自动配置的最大工作线程数
CPU数                 32位计算机                        64位计算机
8                          288                                  576
16                        352                                  704
32                        480                                  960

 

task

在worker上运行的最小任务单元。最简单的task就是一个简单batch。例如,客户发过来下面的请求:

<span>1</span> <span>SELECT</span> <span>@@SERVERNAME</span> 
<span>2</span> <span>GO</span>
<span>3</span> <span>SELECT</span> <span>GETDATE</span><span>() 
</span><span>4</span> <span>GO</span> 
登录后复制

那么这两个batch就分别是两个task。SQLSERVER会先分配给第一个batch(select @@servername)一个worker,将结果返回给客户端,再分配第二个batch

(select getdate())一个worker。这两个worker可能是不同的worker,甚至在不同的scheduler上

只要一个task开始运行,他就不会从这个worker上被移出。例如,如果一个select语句被其他连接阻塞住,worker就不能继续运行,只能进入等待状态。但是这个

select task 不会将这个worker释放,让他做其他任务。所以结果是这个worker所对应的线程会进入等待状态

 

yielding

 SQLOS的任务调度算法的核心,就是所有在逻辑scheduler上运行的worker都是非抢占式的 (non-preemptive)。worker始终在scheduler上运行,直到他运行结束,或者主动将scheduler让出给其他worker为止。这个“让出”scheduler的动作,我们叫yieding

每个scheduler都会有一个runnable列表,所有等待CPU运行的worker都会在这个列表里排队,以先进先出的算法,等待SQL分配给他scheduler运行

SQLSERVER定义了很多yieding的规则,约束一个task在scheduler运行的时间。如果task比较复杂,不能很快完成,会保证task在合适的时间点做yieding,不至于占用scheduler太多时间。

常见时间点:

1、当worker每次要去读数据页的时候,SQLSERVER会检查这个worker已经在scheduler上运行了多久,如果已经超过4ms,就做yielding

2、每做64KB的结果集排序,就会做一次yielding

3、在做语句编译compile的过程中(这个过程比较占CPU资源),经常会有yieding

4、如果客户端不能及时把结果集取走,worker就会做yieding

5、一个batch里的每一句话做完,都会做一次yieding

正常来讲,哪怕一个task要做很久,他使用的worker是会经常做yieding的,不会长时间占用CPU不放。如果在一个scheduler上同时有很多worker要运行,

SQLSERVER通过worker自动yielding的方式调度并发运行。这个比Windows用上下文切换context switch更有效

 

 下面用图来说明SQLOS的任务调度算法:

SQLSERVER独特的任务调度算法"SQLOS"

 

总结:

对于每个CPU,SQLSERVER都会有一个scheduler与之对应。在每个scheduler里,会有若干个worker,对应
于每个线程。在客户端发过来请求之后,SQL会将其分解成一个或多个task。根据每个scheduler的繁忙程度,
task会被分配到某个scheduler上。如果scheduler里有空闲的worker,task就会被分配到某个worker上。
如果没有,scheduler会创建新的worker,供task使用。如果scheduler里的worker已经到了他的上限值,
而他们都有task要运行,那么新的task只好进入等待worker的状态

使用下面两个SQL语句可以查看当前SQLSERVER有多少个workers在工作,有多少个tasks在运行

<span>1</span> <span>SELECT</span> <span>*</span> <span>FROM</span><span> sys.dm_os_workers
</span><span>2</span> <span>SELECT</span> <span>*</span> <span>FROM</span>  sys.dm_os_tasks
登录后复制

SQLSERVER独特的任务调度算法"SQLOS"

----------------------------------------------------------华丽的分割线---------------------------------------------------------

说一下上面的图的含义

SELECT * FROM sys.dm_os_workers

SQLSERVER独特的任务调度算法"SQLOS"

SQLSERVER独特的任务调度算法"SQLOS"

SQLSERVER独特的任务调度算法"SQLOS"

其他列的解释大家可以看一下MSDN

http://msdn.microsoft.com/zh-cn/library/ms178626(v=SQL.105).aspx

------------------------------------------------------------------------------------------------------------

SELECT * FROM  sys.dm_os_tasks

SQLSERVER独特的任务调度算法"SQLOS"

任务的状态可以是下列选项之一

PENDING:正在等待工作线程。

RUNNABLE:可运行,但正在等待接收量程。

RUNNING:当前正在计划程序中运行。

SUSPENDED:具有工作线程,但正在等待事件。

DONE:已完成。

SPINLOOP:陷入自旋锁

MSDN的解释:http://msdn.microsoft.com/zh-cn/library/ms174963(v=SQL.105).aspx

久没有写文章了,希望大家看了我的文章能够更加深入了解SQLSERVER

要睡了,熬不住了~

----------------------------------------------------------

2013-6-3补充

附网上流传的手稿图一张

SQLSERVER独特的任务调度算法"SQLOS"

 

2014-2-2补充:

SQLOS所用的DLL

SQLSERVER独特的任务调度算法"SQLOS"

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

sqlserver数据库中已存在名为的对象怎么解决 sqlserver数据库中已存在名为的对象怎么解决 Apr 05, 2024 pm 09:42 PM

对于 SQL Server 数据库中已存在同名对象,需要采取以下步骤:确认对象类型(表、视图、存储过程)。如果对象为空,可使用 IF NOT EXISTS 跳过创建。如果对象有数据,使用不同名称或修改结构。使用 DROP 删除现有对象(谨慎操作,建议备份)。检查架构更改,确保没有引用删除或重命名的对象。

​sqlserver怎么导入mdf文件 ​sqlserver怎么导入mdf文件 Apr 08, 2024 am 11:41 AM

导入步骤如下:将 MDF 文件复制到 SQL Server 的数据目录(通常为 C:\Program Files\Microsoft SQL Server\MSSQL\DATA)。在 SQL Server Management Studio(SSMS)中,打开数据库并选择“附加”。单击“添加”按钮,选择 MDF 文件。确认数据库名称,点击确定按钮即可。

sqlserver服务无法启动怎么办 sqlserver服务无法启动怎么办 Apr 05, 2024 pm 10:00 PM

当 SQL Server 服务无法启动时,可采取以下步骤解决:检查错误日志以确定根本原因。确保服务帐户具有启动服务的权限。检查依赖项服务是否正在运行。禁用防病毒软件。修复 SQL Server 安装。如果修复不起作用,重新安装 SQL Server。

怎么查看sqlserver端口号 怎么查看sqlserver端口号 Apr 05, 2024 pm 09:57 PM

要查看 SQL Server 端口号:打开 SSMS,连接到服务器。在对象资源管理器中找到服务器名称,右键单击它,然后选择“属性”。在“连接”选项卡中,查看“TCP 端口”字段。

sqlserver误删数据库怎么恢复 sqlserver误删数据库怎么恢复 Apr 05, 2024 pm 10:39 PM

若误删 SQL Server 数据库,可采取以下步骤恢复:停止数据库活动;备份日志文件;检查数据库日志;恢复选项:从备份恢复;从事务日志恢复;使用 DBCC CHECKDB;使用第三方工具。请定期备份数据库并启用事务日志以防止数据丢失。

sqlserver安装失败怎么样删除干净 sqlserver安装失败怎么样删除干净 Apr 05, 2024 pm 11:27 PM

如果 SQL Server 安装失败,可通过以下步骤清理:卸载 SQL Server删除注册表项删除文件和文件夹重启计算机

sqlserver英文安装怎么更改中文 sqlserver英文安装怎么更改中文 Apr 05, 2024 pm 10:21 PM

SQL Server 英文安装可通过以下步骤更改为中文:下载相应语言包;停止 SQL Server 服务;安装语言包;更改实例语言;更改用户界面语言;重启应用程序。

使用C++实现机器学习算法:常见挑战及解决方案 使用C++实现机器学习算法:常见挑战及解决方案 Jun 03, 2024 pm 01:25 PM

C++中机器学习算法面临的常见挑战包括内存管理、多线程、性能优化和可维护性。解决方案包括使用智能指针、现代线程库、SIMD指令和第三方库,并遵循代码风格指南和使用自动化工具。实践案例展示了如何利用Eigen库实现线性回归算法,有效地管理内存和使用高性能矩阵操作。

See all articles