sql server 2012 数据引擎任务调度算法解析(上)
微软在sql server 2012版本之后,引入了新的任务调度算法,这个算法与之前的版本有一些细微的差别。我在这里试着简单描述一下,一些基本概念就不再赘述了,比如NUMA、scheduler、worker什么的,这些内容在网上一搜一大把,如果不了解随便看几篇文章大概也就有所了解了。
让我们从最基本的内容开始:
在sql server 2012版本以前,整个任务的调度是在一个新的连接到达数据库引擎开始的。当新的连接到达后会以轮循的方式在与连接端口绑定的某一NUMA节点上指派一个scheduler(注1) ,之后,这个新的连接会分配给当前节点负载系数最小的一个scheduler,负载系数大致等于分配给scheduler的任务数,需要注意的是这个负载系数与当前节点上的CPU使用率无关
(我们可以通过select scheduler_id,current_tasks_count from sys.dm_os_schedulers 查看scheduler上的当前任务数)
在给连接分配了一个scheduler后,只要这个连接没有断开,分配的scheduler就与这个连接保持着分配关系,即成为了这个连接的首选scheduler。当客户端提交一个命令后,如batch,rpc等,sqlos也会为这个任务指定一个scheduler,并且保持到命令执行完毕。
在为任务分配scheduler时候,sqlos会优先选择当前连接的首选scheduler,但如果连接的首选scheduler负载系数比最低负载scheduler高出20%,那么sqlos会将这个任务分配给同一NUMA节点下的负载系统最小的scheduler
我们来画个图表示一下,假设默认端口1433只绑定了NUMA节点0

连接以及任务分配流程:
- 新连接到达后,会按与端口绑定的NUMA进行轮循选择节点,但我们只绑定了NUMA 0,所以也没什么好选的了
- 在连接到达NUMA 0后,sqlos会把此新连接分配到负载系数最小(10)的sche0上。
- 此连接客户端发出命令,sqlos发现sche0为首选sheduler,且负载系数正常,则直接使用sche0进行任务指派,且负载系数+1=11
- 此时,sche1上的一个空闲连接发出了新的命令,sqlos先判断sche1为这个连接的首选scheduler,但是由于sche1的负载为14,sche0为11,计算14/11= 1.272727,即首选sche1负载已经高于sche0 20%以上,所以sqlos将在sche0上进行任务指派,sche0负载+1,sche1负载不变(注意此连接的首选scheduler没有变,还是sche1,在命令执行完毕后,如果再发出新的命令,还是要再次重复流程4)
以上即是sql server 2012版本以前(包括2012)的基本任务调度算法……可是等一等,不是说2012的算法改了吗,怎么还包括2012??
这里要说明的是:只有sql server 2012 Enterprise Edition使用了新的算法,其它版本的调度流程没有变,还是同上面写的一致
新连接到达后,一直到给连接指派scheduler都是与之前的流程一致,没有变化,主要变化是在给连接指定了scheduler后,连接发出一个新的命令,sqlos给任务指派scheduler的算法有小小的改变,那么具体的改变是什么呢??
且听下回……分解
注1:为什么说是与端口绑定的NUMA呢
因为通过tcp端口的建立连接是可以通过设置NUMA掩码的方式进行NUMA绑定,这样可以更合理的分配cpu的使用
假设我们有一个4个NUMA节点的数据库实例,节点的编号分别为3210。此实例上面跑了两条不同的业务线,一个业务线的优先级比较高,比如面向前端用户的OLTP业务;另一个业务线是需要大量计算资源的OLAP后台业务,但是OLAP的业务线对于结果的返回不需要实时性(当然很少OLTP和OLAP业务都使用一个服务器),那么我们可以让OLAP业务只使用一个NUMA节点,各种计算就让它慢慢在哪算,不要占用过多的CPU资源;OLTP分配三个NUMA,保证前台用户的访问有足够资源,那么掩码的设置可以这样:

那我们在配置管理器中设置sql server的侦听端口为下图,重启服务就可以了

sql server 2012 数据引擎任务调度算法解析(上)的更多相关文章
- sql server 2012 数据引擎任务调度算法解析(下)
上次我们说到,sql server 2012的企业版的任务调度流程,一直到给新连接分配了scheduler,都是与以前的版本算法是一致的,只有在进行任务分配的时候,算法才有了细微的调整. 新算法的目的 ...
- SQL Server 2012数据导入SQL Server 2008
SQL Server 2012可以降级到2008吗?没有找到方法,似乎也不支持.整理了一个变通的方法,把2012的数据和结构导出,然后再导入2008. 在 SQL Server 2012 使用 Sql ...
- Azure 云平台用 SQOOP 将 SQL server 2012 数据表导入 HIVE / HBASE
My name is Farooq and I am with HDinsight support team here at Microsoft. In this blog I will try to ...
- SQL Server 2012 - 数据表的操作
unicode:双字节编码 variable:可变的 character:字符 T-SQL: Transact Structured Query Language unique:唯 ...
- SQL Server 2012 读写分离设置
SQL Server 2012 读写分离设置 - AlsoIn 时间 2014-07-21 17:38:00 博客园-所有随笔区 原文 http://www.cnblogs.com/also/p/ ...
- SQL Server 2012 管理新特性:AlwaysOn 可用性组
SQL Server 2012 新特性(一)管理新特性:AlwaysOn 一.准备环境 1.准备4台计算机 域控制器DC1,IP地址192.168.1.1 主节点SQL1:IP地址192.168.1. ...
- Sql Server 2012 集群配置
基于Windows Server 2008 R2的WSFC实现SQL Server 2012高可用性组(AlwaysOn Group) 2012年5月 微软新一代数据库产品SQL Server 201 ...
- SQL Server 2012 读写分离设置 - AlsoIn
原文转至:http://www.tuicool.com/articles/a6rmiam/ 引用: http://technet.microsoft.com/zh-cn/library/jj16176 ...
- 疑难杂症--SQL SERVER 2012下数据库内存异常回收
--=================================================================== --背景: 在一台SQL SERVER 2012 SP1(1 ...
随机推荐
- 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入
一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...
- IIS事件查看器_WebServer事件查看器_帮助查看IIS-Web服务器事件执行日志
IIS服务器是我们常用的Web站点部署工具,而我们有时可能遇到IIS服务器的应用程序池莫名其妙的关闭了,或者是其他未知原因等等,我们这是可以通过微软提供的WebServer(Web服务事件查看器),来 ...
- 【Win10开发】处理PC上的后退键
我们知道在win10手机上和平板上都会有后退键,那么PC上该怎么办呢?没关系我们慢慢揭晓. 如果你已经是UWP的忠实用户,那么肯定会见到如下的后退键. 那么我们如何来做出来呢?, 我们首先打开App. ...
- python基础学习笔记2
词典 词典(dictionary)与列表相似,也可以存储多个元素.存储多个元素的对象称为容器(container); 常见的创建词典的方法: >>>dic = {'tom':11 ...
- Scalaz(56)- scalaz-stream: fs2-安全运算,fs2 resource safety
fs2在处理异常及资源使用安全方面也有比较大的改善.fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常.在纯代码里隐式引发异常或者在运算中引发异常,举例如下: /函数 ...
- nginx配置多个虚拟主机vhost
在nginx下配置虚拟主机vhost非常方便.主要在nginx的配置文件nginx.conf中添加一个server即可 比如我想配置两个虚拟主机,通过域名linux.com和linux2.com访问, ...
- ABAP使用OLE2对象创建EXCEL文件
厌倦了总是下载一模一样的EXCEL文档?没有颜色,边框,有效性验证.... 让我们看看怎样用OLE2对象来创造可爱的EXCEL工作表吧!(效果如下) 首先你需要知道微软EXCEL中的不同部分的名称,每 ...
- NSString 的常用操作
NSString *testStr01=@"HelloWord"; NSString *testStr02=[testStr01 substringToIndex:];//取头(从 ...
- Metasploit各版本对比
功能特性 描述 Metasploit Framework Metasploit Community Metasploit Express Metasploit Pro Pricing ...
- GitHub学习心得之 分支操作
目录 前言 1. 一般的push和pull 2. 分支操作 前言 本文对Github的分支操作进行了总结, 主要基于以下文章: http://blog.csdn.net/guang11cheng/ar ...