Worker 直接使用 Scheduler,每个 Worker 只会关联到 1 个 Scheduler,Worker 不能从一个 Scheduler 转移到另一个 Scheduler 上。
Worker 处理的工作单元可以是一个 Request,也可以是一个 Task。比如批处理 Request 可能被分解成多个 Task。当 Scheduler 接收到新的 Request 或 Task 请求时,如果当前没有空闲 Worker(Idle Worker),则根据配置开始创建新的 Worker,而 Request 或 Task 将被绑定到该 Worker 上。
SELECT is_idle
,COUNT(*) AS [count]
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
AND is_online = 1
GROUP BY is_idle;
sys.dm_os_schedulers 中的 scheduler_id < 255 则为常规查询,如果 scheduler_id >= 255 则为系统内调度。
如果 Worker 已经空闲了至少 15 分钟以上,或者 SQL Server 检测到有内存压力时,空闲的 Worker 可能被销毁。
- 在 32 位机上,1 个 Worker 至少占用 0.5M 的内存。
- 在 64 位机上,1 个 Worker 至少占用 2M 的内存。
所以,销毁空闲的 Worker 以释放内存可以立即改善系统对内存的迫切需求。
SQL Server 设计了非常高效的 Worker Pool,所以即使有大量的并发在访问数据库,可能 Worker Pool 的大小仍远小于配置的 Max Worker Threads 的值。但尽管如此,如果 Worker 中处理的 Task 发生了锁定或者等待 IO 完成等阻塞操作,Worker 即会被阻塞,Worker 不会其他任何请求直到阻塞条件解除。
SELECT AVG(current_workers_count) AS [avg_current_workers_count]
,AVG(active_workers_count) AS [avg_active_workers_count]
,MAX(current_workers_count) AS [max_current_workers_count]
,MAX(active_workers_count) AS [max_active_workers_count]
,SUM(current_workers_count) AS [total_current_workers_count]
,SUM(active_workers_count) AS [total_active_workers_count]
,SUM(pending_disk_io_count) AS [total_pending_disk_io_count]
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
AND is_online = 1;
SQL Server 中的 Session 实际上只描述了建立连接后的通道,通过该通道可以发送 Request,通道也可以保持空闲。所以 Session 不会与特定的 Scheduler 进行绑定。
SELECT s.session_id
,r.command
,r.[status]
,r.wait_type
,r.scheduler_id
,w.is_preemptive
,t.task_state
,u.cpu_id
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_exec_requests AS r ON s.session_id = r.session_id
INNER JOIN sys.dm_os_tasks AS t ON r.task_address = t.task_address
INNER JOIN sys.dm_os_workers AS w ON t.worker_address = w.worker_address
INNER JOIN sys.dm_os_schedulers AS u ON t.scheduler_id = u.scheduler_id
WHERE s.is_user_process = 0
ORDER BY r.scheduler_id;
当 Session 建立后,会将当前负载最低的 Scheduler 分配给该 Session。然后,当 Session 中有新的 Request 抵达时,SQL Server 会将最近处理过该 SPID 中 Request 的 Scheduler 作为推荐的调度器(Preferred Scheduler)优先调度。尽管如此,当 Session 中抵达的 Request 开始排队时,SQL Server 会计算每个 Scheduler 的 Load Factor,寻找负载最低的 Scheduler 来处理任务。
《人人都是 DBA》系列文章索引:
本系列文章《》由 发表自个人技术博客,未经作者本人同意禁止任何形式的转载,任何自动或人为的爬虫转载或抄袭行为均为耍流氓。
热门排行
今日推荐
-
卡林巴拇指琴官方版
版本:v1.0.2
大小:26.93MB
日期:2024-10-11
-
电视遥控器安卓版
版本:v8.5.0
大小:9.42MB
日期:2024-10-10
-
小决定免费版
版本:v2.28
大小:4.70MB
日期:2024-10-10
-
全能扫描大师安卓版
版本:v5.6
大小:5.82MB
日期:2024-10-10
-
今日临高手机版
版本:v1.7.2
大小:96.46MB
日期:2024-10-10
-
掌上华医官方版
版本:v6.21.21
大小:13.05MB
日期:2024-10-10
热门手游
-
欧呜欧手机版
版本:v1.0
大小:147.16MB
日期:2024-10-11
-
铁匠日记2正版
版本:v1.0
大小:0KB
日期:2024-10-11
-
俄罗斯方块完整版
版本:v1.20
大小:29.03MB
日期:2024-10-11
-
喵喵妙妙塔数涂正版
版本:v1.0.2
大小:92.33MB
日期:2024-10-11
-
收纳强迫症官方版
版本:v189.1.0
大小:100.20MB
日期:2024-10-11
-
沉浸式生活免费版
版本:v1.0.0
大小:72.20MB
日期:2024-10-10
|