微软在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

连接以及任务分配流程:

  1. 新连接到达后,会按与端口绑定的NUMA进行轮循选择节点,但我们只绑定了NUMA 0,所以也没什么好选的了
  2. 在连接到达NUMA 0后,sqlos会把此新连接分配到负载系数最小(10)的sche0上。
  3. 此连接客户端发出命令,sqlos发现sche0为首选sheduler,且负载系数正常,则直接使用sche0进行任务指派,且负载系数+1=11
  4. 此时,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 数据引擎任务调度算法解析(上)的更多相关文章

  1. sql server 2012 数据引擎任务调度算法解析(下)

    上次我们说到,sql server 2012的企业版的任务调度流程,一直到给新连接分配了scheduler,都是与以前的版本算法是一致的,只有在进行任务分配的时候,算法才有了细微的调整. 新算法的目的 ...

  2. SQL Server 2012数据导入SQL Server 2008

    SQL Server 2012可以降级到2008吗?没有找到方法,似乎也不支持.整理了一个变通的方法,把2012的数据和结构导出,然后再导入2008. 在 SQL Server 2012 使用 Sql ...

  3. 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 ...

  4. SQL Server 2012 - 数据表的操作

     unicode:双字节编码      variable:可变的    character:字符 T-SQL:  Transact Structured Query Language unique:唯 ...

  5. SQL Server 2012 读写分离设置

    SQL Server 2012 读写分离设置 - AlsoIn 时间 2014-07-21 17:38:00  博客园-所有随笔区 原文  http://www.cnblogs.com/also/p/ ...

  6. SQL Server 2012 管理新特性:AlwaysOn 可用性组

    SQL Server 2012 新特性(一)管理新特性:AlwaysOn 一.准备环境 1.准备4台计算机 域控制器DC1,IP地址192.168.1.1 主节点SQL1:IP地址192.168.1. ...

  7. Sql Server 2012 集群配置

    基于Windows Server 2008 R2的WSFC实现SQL Server 2012高可用性组(AlwaysOn Group) 2012年5月 微软新一代数据库产品SQL Server 201 ...

  8. SQL Server 2012 读写分离设置 - AlsoIn

    原文转至:http://www.tuicool.com/articles/a6rmiam/ 引用: http://technet.microsoft.com/zh-cn/library/jj16176 ...

  9. 疑难杂症--SQL SERVER 2012下数据库内存异常回收

    --=================================================================== --背景: 在一台SQL SERVER 2012 SP1(1 ...

随机推荐

  1. 深入剖析tomcat之一个简单的servlet容器

    上一篇,我们讲解了如果开发一个简单的Http服务器,这一篇,我们扩展一下,让我们的服务器具备servlet的解析功能. 简单介绍下Servlet接口 如果我们想要自定义一个Servlet,那么我们必须 ...

  2. SignalR的Javascript客户端API使用方式整理

    SignalR的服务端提供了两种实现方式,分别是PersistentConnection和Hub,这两种方式的侧重点不同: PersistentConnection更接近于底层,编程接口比较简单,传输 ...

  3. Python_Day_03 list,dic,tuple方法总结

    编程语言中最长见的几种数据类型,字典,列表,等.同样在Python中也有这些数据类型,只是有些表现形式不同.同时在Python中又多了一种叫做元组(tuple)的东西. list(列表) 初始化列表 ...

  4. Android网络编程1

    最近在自学Android开发,从这篇开始作为我学习android开发的笔记,来记录学习过程中遇到的问题点和其解决的方法: Ui界面代码 <?xml version="1.0" ...

  5. c语言 sizeof理解

    1.基本数据类型 char :1     short:2   int 4    long 4   long long :8    float:4    double :8字节. 2.数组:对应的基本数 ...

  6. PHP运算符

    运算符 PHP运算符可以根据操作数的个数分为一元运算符.二元运算符.三元运算符.一元运算符例如!(取反运算符)或++(加一运算符),PHP支持的大多数运算符都是这种二元运算符,例如+.-.*./等算数 ...

  7. arcgis软件集合

    ArcGIS软件应有尽有,跨越各种不同的ArcGIS版本,包括ArcGIS10.3.ArcGIS10.2.2.ArcGIS10.1.ArcGIS10.0.ArcGIS9.3. 备注:更多的精彩内容请关 ...

  8. iOS Xcode 打包之后,不能输出日志

    现象:一个项目,之前做的好好的,后来打包,生成ipa文件之后, 再运行的时候,NSLog的日志都不输出了. 解决方案: 在模式选择里面,里面包含:“Debug”.“Release”两种,设置“Debu ...

  9. 请将项目文件中的“AutoGenerateBindingRedirects”属性设置为 true 警告!!!

  10. Dev TreeList 总结

    1.表格的要求:如果要求有父子节点关系,则必须有ID和ParentID字段,并且父节点ParentID字段必须指向ID字段. 2.Access表格在穿入DATATABLE的时候,要想表现出父子节点关系 ...