天天看點

人人都是 DBA(III)SQL Server 排程器

在 SQL Server 中,當資料庫啟動後,SQL Server 會為每個實體 CPU(包括 Physical CPU 和 Hyperthreaded)建立一個對應的任務排程器(Scheduler),Scheduler 可以看作為邏輯 CPU(Logical CPU)。

根據 Affinity Mask 選項的配置,Scheduler 的狀态被設定為 ONLINE 或 OFFLINE。使用下面的 SQL 來查詢目前環境中 Scheduler 的狀态。

<a></a>

人人都是 DBA(III)SQL Server 排程器

預設的 Affinity Mask 是 0,也就是所有 Scheduler 均為 ONLINE。

人人都是 DBA(III)SQL Server 排程器

例如,如果把 Affinity Mask 設定為 3,即 00000011,則意味着隻有 0 和 1 号 CPU 可以使用。

假設有 64 個 CPU,則常用的 Affinity Mask 值有:

255 -&gt; 0xFF

65280 -&gt; 0xFF00

16711680 -&gt; 0xFF0000

4278190080 -&gt; 0xFF000000

4294967040 -&gt; 0xFFFFFF00

-256 -&gt; 0xFFFFFF00

下面的 VM 的配置為 4 * 8 = 32 Logical CPUs 情況。

人人都是 DBA(III)SQL Server 排程器

設定 NumaNode0 上的 8 個 CPU 用于 I/O,其他 3 個節點用于 Processor。

人人都是 DBA(III)SQL Server 排程器
人人都是 DBA(III)SQL Server 排程器

Scheduler 負責根據需求建立和銷毀 Worker,一個 Worker 即可是一個 Thread 也可以是一個 Fiber,可以通過 Max Worker Threads 和 Use Windows Fibers 配置項來進行設定。

Max Worker Threads 選項負責限制線程池(Threading Pool)中線程的最大數量。

人人都是 DBA(III)SQL Server 排程器

預設值為 0,即允許 SQL Server 根據 CPU 和版本情況進行自動配置最大線程數量。

 Number of CPUs

 32-bit Computor 

 64-bit Computor 

 &lt;= 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。

人人都是 DBA(III)SQL Server 排程器

Worker 直接使用 Scheduler,每個 Worker 隻會關聯到 1 個 Scheduler,Worker 不能從一個 Scheduler 轉移到另一個 Scheduler 上。

Worker 處理的工作單元可以是一個 Request,也可以是一個 Task。比如批處理 Request 可能被分解成多個 Task。當 Scheduler 接收到新的 Request 或 Task 請求時,如果目前沒有空閑 Worker(Idle Worker),則根據配置開始建立新的 Worker,而 Request 或 Task 将被綁定到該 Worker 上。

人人都是 DBA(III)SQL Server 排程器

sys.dm_os_schedulers 中的 scheduler_id &lt; 255 則為正常查詢,如果 scheduler_id &gt;= 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 不會其他任何請求直到阻塞條件解除。

人人都是 DBA(III)SQL Server 排程器

SQL Server 中的 Session 實際上隻描述了建立連接配接後的通道,通過該通道可以發送 Request,通道也可以保持空閑。是以 Session 不會與特定的 Scheduler 進行綁定。

人人都是 DBA(III)SQL Server 排程器

當 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,如需轉載請自行聯系原作者