位置: 编程技术 - 正文

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)(sql server ssrs)

编辑:rootadmin

推荐整理分享SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)(sql server ssrs),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sqlserver ssis,sqlserver sysname,sqlserver sysname,sqlserver sysprocesses,sqlserver sysprocesses,sqlserverssms,sqlserver sysname,sqlserverssms,内容如对您有帮助,希望把文章链接给更多的朋友!

 通过上篇文章给大家介绍了SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上) ,说了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在获取并行等待的时候得不同结果,这一篇我们谈论下我的第二个疑问:为什么一个并行计划(4线程)却一下出现了那么多等待,SQL的并行到底是怎么执行的!!!!

    先贴以下上篇sys.dm_os_waiting_tasks 的结果图:

    我们分析一下这个结果的task_address 可以看出去掉重复其实只有9个,也就是说一个并行(4线程,配置不同,情况也不同)会有9个task。 又是线程,又是task ,还有worker,schedulers 这些都是什么? 这个有必要先说一下,因为这篇博客前我也是乱乱的。

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空闲超过分钟,scheduler可能会删除这个worker,以及其对应的线程。当SQLSERVER遇到内存压力的时,也会大量删除处于空闲状态的worker,以节省multi-page的内存开销各种CPU和SQLSERVER版本组合自动配置的最大工作线程数CPU数 位计算机 位计算机<=4

task

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

SELECT @@SERVERNAME GO SELECT GETDATE() GO

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)(sql server ssrs)

那么这两个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、每做KB的结果集排序,就会做一次yielding

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

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

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

正常来讲,哪怕一个task要做很久,他使用的worker是会经常做yieding的,不会长时间占用CPU不放。如果在一个scheduler上同时有很多worker要运行,SQLSERVER通过worker自动yielding的方式调度并发运行。这个比Windows用上下文切换context switch更有效

    另附一张手绘图

    另外推荐一篇 SQL SERVER SQLOS的任务调度 微软亚太的官方博客

    我们大概了解了一下SQL SERVER SQLOS的任务调度 我们回到我们的并行话题看一下这个并行执行的调度情况:

    一个并行处理分配给了9个task,同时也启用了9个worker,由4个scheduler调度,每个scheduler分别由一个申请数据,另一个等待。那么申请数据的是可以理解的,等待的是干什么的呢?个人理解和当前的执行计划有关,4个线程取得数据后要做汇总的操作SQL不会等待数据获取以后再开启线程接收,而是接收线程在获取数据的时候等待。

     

 疑问得到解决了么?因为已经标记为中篇,可见还是有疑问呀!!!!我们继续下一篇吧....

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(下) sys.dm_os_waiting_tasks引发的疑问(下)前面写了两篇了,其实不光是说sys.dm_os_waiting_tasks的应用,研究了挺长时间的并行,自己有了一些理解,所以分享出来

SQL Report Builder 报表里面的常见问题分析 一SQL报表常常会遇到在表格中的相除,如果分母为零,一般会显示错误号,我们可以这么处理:(加上是A/B)=A/iif(B=0,,B)但是我们不能这么写

SQL数据库优化大总结之百万级数据库优化方案 网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。(1)选择

标签: sql server ssrs

本文链接地址:https://www.jiuchutong.com/biancheng/312849.html 转载请保留说明!

上一篇:SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上)(sql server应用)

下一篇:SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(下)(sqlserver sid)

  • 长期待摊费用一般指什么
  • 进项税额转出完整会计分录怎么做 案例
  • 非限定性净资产相当于本年利润吗
  • 每个季度申报怎么申报?
  • 信用评估费用收费标准
  • 成本占收入比重分析
  • 资产减值损失为什么不能转回
  • 总分机构汇算清缴成功后还需要填表什么报表
  • 企业卖旧房如何计算缴纳土地增值税
  • 红冲暂估原材料如何做会计分录
  • 暂估成本跨年后未收到票如何处理
  • 旅游业差额开票的票据可以累计一季度吗
  • 固定资产盘盈可计入
  • 低值易耗品是成本吗
  • 出口退税进项发票
  • 发票专用章只能盖一个
  • 宣传资料设计制作
  • 初级会计职称考试时间
  • 代扣大额医保进哪个账户
  • 小规模纳税人每季度超过30万交税
  • 补贴收入是否缴税
  • 收购报废车有利润吗
  • 显卡硬件加速如何开启
  • linux如何将命令结果输出到文件
  • 映泰主板系统重装
  • 哪些情况需要补钙
  • PHP:xml_set_processing_instruction_handler()的用法_XML解析器函数
  • php json转对象
  • 无形资产的摊销计入什么科目
  • 行政单位跨年度收到发票,补付尾款会计分录
  • PHP:session_unset()的用法_Session函数
  • 点云目标检测数据集
  • php二维数组的遍历
  • PHP:proc_get_status()的用法_命令行函数
  • 固定资产毁损应该填制什么凭证
  • php二维码解码
  • php消息队列kafka
  • php主要用于
  • PHP自定义函数实现计算机整数的四次方
  • 将本月发生的制造费用总额按生产工人
  • 厂区租赁 法律规定
  • 培训费用是什么成本
  • 开出租车怎么租车
  • c语言realloc函数的用法
  • springsecurity有什么用
  • 以土地使用权投资入股的会计处理
  • 含税采购金额怎么算
  • 美元利息结汇是属于外汇
  • 计提怎么理解
  • 异地项目增值税要异地缴纳吗
  • 党建经费提取是上年度还是下年
  • sql server 2016 always on
  • 做账是指做什么
  • 免税设备是什么意思
  • 应收票据的分录怎么做
  • 押金是否可以抵扣租金
  • 招待费如何做账科目
  • 商业承兑汇票过期了怎么办
  • 加班餐补需要发票嘛
  • 实收资本实际缴纳要去税务局备案吗
  • 单价合同如何计算印花税
  • 公司对帐的内容怎么写
  • 用mysql的小技巧
  • MS DTC 事务管理器无法启动的解决方案
  • lumia1020手机
  • macbook截图快捷键是哪个键
  • linux操作系统的安装
  • rftray.exe - rftray是什么进程 有什么用
  • rtos用什么语言
  • linux内核架构
  • linux日志数据种类
  • apache2.4配置文件详解
  • linux怎样过滤一个关键字
  • 厦门翔安到同安有多远
  • unity怎么学
  • unity ui批处理
  • jQuery EasyUI Tab 选项卡问题小结
  • 税控盘登录密码忘了怎么办怎么重置
  • 重庆电子税务局app下载
  • 国家税务总局组建千户集团税收风险分析专业团队
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设