首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server OS 任務調度機制深度解析:Scheduler、Worker 與 Task 協作模型

     編輯:關於SqlServer

核心概念:SQL Server OS (SQLOS)

SQLOS 是建構在 Windows 之上的使用者模式作業系統層,抽象出排程、記憶體、同步、鎖管理、緩衝池等核心服務,為儲存引擎提供高效、可控的執行環境。本文聚焦其**非搶佔式協作排程機制**。

搶佔式 vs 非搶佔式 (協作式) 排程

特性Windows (搶佔式)SQLOS (協作式)
CPU 分配OS 強制依時間片/優先級剝奪Worker 主動 Yield (讓出)
中斷點OS 決定,不知資料庫關鍵區段Worker 自行選擇安全點
Context Switch 代價高 (User/Kernel 模式切換)低 (減少不必要切換)
適用場景通用多工資料庫高併發、短任務

SQLOS 相信內部執行緒會合作,僅在 Worker 主動 Yield 或阻塞 (鎖、I/O、等待) 時切換,大幅降低 Context Switch 頻率。

三大核心元件架構

1. Scheduler (邏輯 CPU)

  • 每個邏輯 CPU 對應一個 Scheduler (可見於 sys.dm_os_schedulers)
  • 同一時間僅一個 Worker 在 Scheduler 上 RUNNING
  • 可透過 Affinity Mask 將 Scheduler 綁定/離線特定 CPU (線上生效,無需重啟)
  • 特殊 Scheduler (ID > 255) 保留給 DAC、資源管理、備份還原等系統任務
  • Scheduler 可在物理 CPU 間移動,負載自動平衡

2. Worker (執行緒/纖程封裝)

  • 1:1 對應 Windows Thread (或 Fiber)
  • 按需建立,上限由 max worker threads 控制 (預設自動計算,32/64 位不同公式)
  • 每 Scheduler 擁有 Worker Pool,優先複用閒置 Worker
  • 閒置超過 15 分鐘或記憶體壓力時自動 Trim Pool 釋放記憶體 (~2MB/Worker)
  • 同一連接的多個 Batch 傾向複用同一 Worker

3. Task (最小工作單元)

  • 一個 Batch 可能包含多個 Task
  • Task 排入 Scheduler 的 Runnable Queue,取得 Worker 後執行
  • 新 Task 依 load_factor 分配至負載最低 Scheduler (連接記憶上次 Scheduler 作為 Hint,負載差 >20% 時忽略)
  • 系統永久 Task (Deadlock Monitor、Lazy Writer) 永久佔用 Worker

Worker Yield (主動讓出) 機制

非搶佔式排程關鍵在於**及時 Yield**,避免長任務佔用 CPU 導致其他 Worker 饑餓。主要 Yield 場景:

  1. Quantum Yield:~4ms (可查 quantum_length_us),SOS_SCHEDULER_YIELD 等待類型來源
  2. 每 64K 結果集排序 Yield 一次
  3. 編譯/重編譯 階段 Yield
  4. 讀取資料頁、Batch 陳述式結束、客戶端消費緩慢 (ASYNC_NETWORK_IO) 等

搶佔式模式切換

執行擴展預存程序、Windows API、Log Growth (Zeroing) 等非 SQLOS 可控代碼時,必須切換至 Preemptive 模式:

  1. Worker 釋放 Scheduler 控制權,下一個 Runnable Worker 取得
  2. 該 Task 脫離 SQLOS 排程,交由 Windows 排程器管理
  3. 完成後重新進入協作模式,排隊等待 Scheduler

對應等待類型前綴 PREEMPTIVE_*。

單一 Scheduler 排程循環模型

[Runnable Queue] → (Dispatch) → [RUNNING Worker] 
    ↑                    ↓
    └── (Yield/Wait) ←──┘
  • Dispatcher 從 Runnable Queue 取頭 Worker 執行
  • Worker 執行至 Yield 點或阻塞,釋放 Scheduler
  • 阻塞 Worker 進入 Waiter List,資源就緒後回 Runnable Queue 尾端

監控與診斷關鍵 DMV

DMV用途
sys.dm_os_schedulersScheduler 狀態、負載、Quantum、Worker 計數
sys.dm_os_workersWorker 狀態、關聯 Task、Scheduling 資訊
sys.dm_os_tasksTask 狀態、類型、關聯 Worker/Session
sys.dm_exec_requests執行中請求、Task Address、等待類型
sys.dm_os_wait_stats累積等待統計 (含 SOS_SCHEDULER_YIELD、PREEMPTIVE_*)

總結

SQLOS 以協作式非搶佔排程取代 OS 原生排程,配合精細的 Yield 機制、Scheduler/Worker/Task 三層架構,實現高併發、低 Context Switch、可觀測的資料庫任務調度。理解此機制有助於診斷 SOS_SCHEDULER_YIELD 壓力、Worker 耗盡、CPU 負載不均等進階效能問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved