本篇文章主要介绍了" sql server中的任务调度与CPU深入讲解",主要涉及到方面的内容,对于SqlServer感兴趣的同学可以参考一下:
一. 概述我们知道在操作系统看来, sql server产品与其它应用程序一样,没有特别对待。但内存,硬盘,cpu又是数据库系统最重要的核心资源,所以在sql ...
2.5 Task在调度运行图如下:
1. 当 Task 是Runnig时,它是Schedler的活动Worker。
2. 当 Task只等待CPU运行时,它被放入Schedler可运行的队列中。
3. 当 Task 在等待某个资源时(比如锁、磁盘输入/输出等)时,它处于“Suspended挂起状态” 状态。
4. 如果Task Scheduler挂起状态完成了等待,那么它就会被放到Scheduler 的Runnable队列的末尾。
5. 如果运行线程自动Yidlding让步,则将其放回Scheduler 的Runnable队列的末尾。
6. 如果运行的线程需要等待某个资源,它将被调出Scheduler调度器并进入挂起状态Waiter list。
7. 如果正在运行的线程完成它的工作,那么Runnable队列的顶部的第一个线程就变成了“运行”线程。
三. 使用dmv任务查看
3.1. 通过sys.dm_os_sys_info 查看scheduler与cpu的关系如下:
SELECT cpu_count,max_workers_count,scheduler_count FROM sys.dm_os_sys_info

3.2 查看最大Worker数
select max_workers_count from sys.dm_os_sys_info
3.3 查看Task与Worker关系
--在每一个连接里,我们可能会有很多batch,分解成多个task以支持如并行查询
select task_address,task_state,scheduler_id,session_id,worker_address
from sys.dm_os_tasks where session_id>50
select state,last_wait_type,tasks_processed_count,task_address, worker_address, scheduler_address
from sys.dm_os_workers where worker_address =0x00000000043621A0

3.4 查看Scheduler
--scheduler_id<255 代表用户CPU,相反代表SYSTEM SCHEDULER
SELECT
scheduler_id,
cpu_id,
is_online,
current_tasks_count,
runnable_tasks_count,
current_workers_count,
active_workers_count,
work_queue_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
cpu_id:关联的cpu 。 CPU ID >=255 这类Scheduler都用于系统内部使用。比如说资源管理、DAC、备份还原操作等。