ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 数据库 >> SqlServer >> sql server中的任务调度与CPU深入讲解

sql server中的任务调度与CPU深入讲解(2/4)

来源:网络整理     时间:2018-08-08     关键词:

本篇文章主要介绍了" sql server中的任务调度与CPU深入讲解",主要涉及到方面的内容,对于SqlServer感兴趣的同学可以参考一下: 一. 概述我们知道在操作系统看来, sql server产品与其它应用程序一样,没有特别对待。但内存,硬盘,cpu又是数据库系统最重要的核心资源,所以在sql ...

256

512

8 processors

288

576

16 processors

352

704

32 processors

480

960

64 processors

736

1472

128 processors

4224

4480

256 processors

8320

8576

根据微软的建议:这个选项是一个高级选项,应该只由经验丰富的数据库管理员或经过认证的SQL Server专业人员更改。如果您怀疑存在性能问题,则可能不是工作线程的可用性。原因更像是I/O,这会导致工作线程等待。在更改最大工作线程设置之前,最好找到性能问题的根本原因。

二.调度原理

2.1 Scheduler任务调度

Sqlserver 的一个Scheduler对应操作系统上的一个逻辑CPU用于任务分配。调度分配从NUMA节点级别开始。基本算法是一个用于新连接的循环调度。当每个新的连接到达时,它被分配给基于循环的调度器。在相同的NUMA节点内,以最小的负载因子分配给调度器的新连接。

2.2  Worker

Worker又称为WorkerThread,每个Worker跟一个线程,是Sql server任务的执行单位。 多个Worker对应一个Scheduler,公式Workers=max worker threads/onlines scheduler。在一个Scheduler上,同一时间只能有一个Worker运行。例如4个处理器的64位操作系统,它的每个Scheduler的Worker是512/4=128。

2.3  Task

在Worker上运行的最小任务单元。最简单的Task就是一个简单的Batch,当一个会话发出一个请求时,Sql server会把这个请求拆分一个或多个任务(Tasks),然后关联对应个数的工作者线程(worker thread)。

例如下面是二个Task ,二个Task可能不是同一个Worker。二个Worker也可能不是同一个Scheduler.           

select @@servername
Go
select getdate()
GO

每个Task线程都有3个状态:

  • Running: 一个处理器在某个时间只能做一件事情,当一个线程正在一个处理器上运行时,这个线程的状态就是running。
  • Suspended: 没有足够资源时,当前线程放弃占有处理器,变成挂起状态。
  • Runnable: 一个线程已完成了等待,但还没有轮到它运行,就会变成runnable状态,这种信号等待(signal wait)

2.4 Yielding

Yelding就是所有逻辑scheduler上运行的Worker都是非抢占式的, 在 Scheduler上Worker由于资源等待,让出给其它Worker就叫Yielding。

下面讲述几种发生的状态:

  1. 当Woker在Scheduler上运行了超过4ms,就做Yielding。

  2. 每做64k的结果集的排序,就会做一次Yielding。

  3. 做语句Complie编译的过程中,这个过程比较占CPU资源时,经常会有Yielding等。

2.5 调度关系图如下:

相关图片

相关文章