在 SQL Server 中,當資料庫啟動後,SQL Server 會為每個實體 CPU(包括 Physical CPU 和 Hyperthreaded)建立一個對應的任務排程器(Scheduler),Scheduler 可以看作為邏輯 CPU(Logical CPU)。
根據 Affinity Mask 選項的配置,Scheduler 的狀态被設定為 ONLINE 或 OFFLINE。使用下面的 SQL 來查詢目前環境中 Scheduler 的狀态。
<a></a>

預設的 Affinity Mask 是 0,也就是所有 Scheduler 均為 ONLINE。
例如,如果把 Affinity Mask 設定為 3,即 00000011,則意味着隻有 0 和 1 号 CPU 可以使用。
假設有 64 個 CPU,則常用的 Affinity Mask 值有:
255 -> 0xFF
65280 -> 0xFF00
16711680 -> 0xFF0000
4278190080 -> 0xFF000000
4294967040 -> 0xFFFFFF00
-256 -> 0xFFFFFF00
下面的 VM 的配置為 4 * 8 = 32 Logical CPUs 情況。
設定 NumaNode0 上的 8 個 CPU 用于 I/O,其他 3 個節點用于 Processor。
Scheduler 負責根據需求建立和銷毀 Worker,一個 Worker 即可是一個 Thread 也可以是一個 Fiber,可以通過 Max Worker Threads 和 Use Windows Fibers 配置項來進行設定。
Max Worker Threads 選項負責限制線程池(Threading Pool)中線程的最大數量。
預設值為 0,即允許 SQL Server 根據 CPU 和版本情況進行自動配置最大線程數量。
Number of CPUs
32-bit Computor
64-bit Computor
<= 4 processors
256
512
8 processors
288
576
16 processors
352
704
32 processors
480
960
64 processors
736
1472
可以使用 sp_configure 來配置該選項。
使用如下 SQL 查詢來檢視目前資料庫環境中的 Max Workers Count 和 Current Workers Count。
Worker 直接使用 Scheduler,每個 Worker 隻會關聯到 1 個 Scheduler,Worker 不能從一個 Scheduler 轉移到另一個 Scheduler 上。
Worker 處理的工作單元可以是一個 Request,也可以是一個 Task。比如批處理 Request 可能被分解成多個 Task。當 Scheduler 接收到新的 Request 或 Task 請求時,如果目前沒有空閑 Worker(Idle Worker),則根據配置開始建立新的 Worker,而 Request 或 Task 将被綁定到該 Worker 上。
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 不會其他任何請求直到阻塞條件解除。
SQL Server 中的 Session 實際上隻描述了建立連接配接後的通道,通過該通道可以發送 Request,通道也可以保持空閑。是以 Session 不會與特定的 Scheduler 進行綁定。
當 Session 建立後,會将目前負載最低的 Scheduler 配置設定給該 Session。然後,當 Session 中有新的 Request 抵達時,SQL Server 會将最近處理過該 SPID 中 Request 的 Scheduler 作為推薦的排程器(Preferred Scheduler)優先排程。盡管如此,當 Session 中抵達的 Request 開始排隊時,SQL Server 會計算每個 Scheduler 的 Load Factor,尋找負載最低的 Scheduler 來處理任務。
《人人都是 DBA》系列文章索引:
序号
名稱
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
本文轉自匠心十年部落格園部落格,原文連結:http://www.cnblogs.com/gaochundong/p/everyone_is_a_dba_sqlserver_scheduler.html,如需轉載請自行聯系原作者