--SQL SERVER OS 采用合作模式的线程调度模式,即除非Worker主动放弃CPU,否则SQL OS 不会强制剥夺其CPU,从而减少Context Switch

--默认设置下,SQL SERVER 创建与逻辑CPU数量相同的Scheduler,但Scheduler并不与CPU硬性绑定直到DBA指定Process Affinity,通过配置Process Affinity(修改关联掩码)来使指定CPU对应的Scheduler离线或联机。

--当特定Scheduler修改为离线时,会将该Scheduler转移到其他CPU上,并阻止为其再分配Worker,当该Scheduler上所有Worker执行完毕后,Scheduler转为离线。

--在负载严重或Scheduler被离线时,一个CPU可能对应多个Scheduler。

--可以使用以下代码来查看

SELECT * FROM sys.dm_os_schedulers S

WHERE S.scheduler_id<255

--对于大于的Scheduler用于系统专用,如死锁检测,CheckPoint, LazyWriter等

--在SQL SERVER中,Scheduler并不直接调用线程处理,而是使用Worker 来承载负载,在特定时刻,一个Scheduler上只能有一个Worker处于运行状态。随着数据库的负载变化,SQL Server会增加或释放Workder。

位还是64位以及SQL Server使用的CPU数量,DBA也可手动配置Workd的最大数量。

分钟或系统面临内存压力时,SQL Server会尝试释放Worker来回收内存,在32位系统下,每个Worker至少占用0.5MB内存,在64位系统下,每个Worker至少占用2MB内存。

--对于每个Scheduler,会有一字段load_factor来表示scheduler的繁忙程度,从而动态地将新Worker分配给负载最小的Scheduler,但对于同一个连接,SQL Server会记住该连接最后一个worker使用的scheduler_id,并尽可能为该连接上后续的worker分配给同一个scheduler(为了减小查找最小负载scheduler的开销),但如果该scheduler上负载大于所有scheduler负载平均值的20%,SQL Server会为新worker分配负载最低的scheduler。

--为提升效率和节约资源,SQL Server使用Worker pool来存放创建的worker,提高其重用率。

--Task是SQL Sever 调度管理器中最小的任务单元,运行于Workder之上,只有获取Worker的Task才能运行。

--对于同一连接发送来的多个Bacth,SQL Sever倾向于交给同一个Task来处理,但也可能交给不同的Worker,运行在不同的schduler上。

--由于SQL Server使用合作的线程调度模式,如果某一个Worker长期占用scheduler就会导致该scheduler上其他runable的worker长时间得不到运行,因此需要SQL Server根据一定策略来将该worker切换出来让其他worker得以运行。Worker切换出来的过程称之为yield,yield可大致分为两种:

1. worker在运行中需要等待获取其他资源而被造成阻塞,在阻塞发生时却换,称为natual yield;

2. worker在长时间运行或某个阶段结束时发生却换,称为voluntarily yield;

--voluntarily yield便是SOS_SCHEDULER_YIELD等待的原因,发生这类yield的场景:

--基于时间片的voluntarily yield大概使得Worker每秒yield一次。这个值可以通过sys.dm_os_schedulers的quantum_length_us列看到。

--每64K结果集排序,就做一次yield。

--语句complie,会做yield。

--读取数据页时

--batch中每一句话做完,就会做一次yield。

--如果客户端不能及时取走数据,worker也会做yield

在高并发下,需要worker频繁地从running状态却换到waiting状态,以实现各请求的快速响应,每次却换即一次switch.

--如果Worker需要运行一些抢占式的代码,则该worker不能再由SQL OS来控制,而需要转交给Windows任务调度系统来控制,当Worker上抢占式的task运行结束后再交给scheduler来控制。

初始化等

SQL OS使用Worker自己yield的方式来实现context switch,该switch提升了并发性,同时与windows的线程switch相比又减少了资源开销。

参考:

1.SQL SERVER 2005技术内幕:存储引擎

2.http://www.cnblogs.com/CareySon/archive/2013/02/01/SqlOSSchedule.html

SQL Server OS 调度的更多相关文章

  1. SQL Server 页面查询超时(SOS_SCHEDULER_YIELD等待)

    一.问题概述 问题大概是这样的,有一个功能页面经常查询超时,有时候就算能查询出来也要很长的时间,但是有时又会很快.遇到的这种问题在排除掉网络原因之后基本上可以从查询语句上去找原因. 编译查询SQL语句 ...

  2. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  3. SQL SERVER数据库的简单介绍

    一.数据库技术的发展 数据库技术是应数据管理任务的需求而产生的,先后经历了人工管理.文件系统.数据库系统等三个阶段. 二.关系型数据库 SQL Server属于关系型数据库. 关系模型 以二维表来描述 ...

  4. 无法将数据库从SINGLE_USER模式切换回MULTI_USER模式(Error 5064),及查找SQL Server数据库中用户spid(非SQL Server系统spid)的方法

    今天公司SQL Server数据库无意间变为SINGLE_USER模式了,而且使用如下语句切换回MULTI_USER失败: ALTER DATABASE [MyDB] SET MULTI_USER W ...

  5. (转)浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  6. SQL Server on Linux: How? Introduction: SQL Server Blog

    SQL Server Blog Official News from Microsoft’s Information Platform https://blogs.technet.microsoft. ...

  7. 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库

    目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...

  8. 人人都是 DBA(III)SQL Server 调度器

    在 SQL Server 中,当数据库启动后,SQL Server 会为每个物理 CPU(包括 Physical CPU 和 Hyperthreaded)创建一个对应的任务调度器(Scheduler) ...

  9. SQL Server 2012中Task是如何调度的?

    SQL Server 2012中Task是如何调度的?[原文来自:How It Works: SQL Server 2012 Database Engine Task Scheduling]     ...

随机推荐

  1. 第七章 二叉搜索树 (d2)AVL树:插入

  2. C++调试帮助

    assert预处理宏 assert是一种预处理宏,所谓预处理其实是一个预处理变量,其行为类似于内联函数,assert宏使用一个表达式作为其条件: assert(expr) 首先是对expr进行求值,如 ...

  3. Infinity,NaN

    常量 说明 Infinity 表示正无穷大的特殊值. -Infinity 表示负无穷大的特殊值. NaN Number 数据类型的一个特殊成员,用来表示“非数字”(NaN) 值. undefined ...

  4. Leapin' Lizards(经典建图,最大流)

    Leapin' Lizards http://acm.hdu.edu.cn/showproblem.php?pid=2732 Time Limit: 2000/1000 MS (Java/Others ...

  5. 33. Search in Rotated Sorted Array旋转数组二分法查询

    一句话思路:反正只是寻找一个最小区间,断开也能二分.根据m第一次的落点,来分情况讨论. 一刷报错: 结构上有根本性错误:应该是while里面包括if,不然会把代码重复写两遍,不好. //situati ...

  6. 提交代码到远程GIT仓库,代码自动同步到远程服务器上。

    现在一般都会通过github,gitlab,gitee来管理我们的代码.我们希望只要我本地push了代码,远程服务器能自动拉取git仓库的代码,进行同步. 这就需要用到各仓库为我们提供的webhook ...

  7. mysql优化概述2

    一.索引的概念 利用关键字,就是记录的部分数据(某个字段,某些字段,某个字段的一部份),建立与记录位置的对应关系,就是索引.索引的关键字一定是排序的. 二.索引的类型 mysql支持四种索引: 1.主 ...

  8. web前端js 实现打印操作

    转载来源:https://www.cnblogs.com/potatog/p/7412905.html 一.打印当前页面指定元素中的内容 方式一:直接使用window.print(); (1)首先获得 ...

  9. cron,at的权限控制

      /etc/cron.deny存在 /etc/cron.deny不存在 /etc/cron.allow存在 只有/etc/cron.allow中列出的用户才能运行crontab -e:忽略/etc/ ...

  10. OpenSSL编程

    简介 OpenSSL是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算.非对称算法密钥生成 ...