SQLOS 是建構在 Windows 之上的使用者模式作業系統層,抽象出排程、記憶體、同步、鎖管理、緩衝池等核心服務,為儲存引擎提供高效、可控的執行環境。本文聚焦其**非搶佔式協作排程機制**。
| 特性 | Windows (搶佔式) | SQLOS (協作式) |
|---|---|---|
| CPU 分配 | OS 強制依時間片/優先級剝奪 | Worker 主動 Yield (讓出) |
| 中斷點 | OS 決定,不知資料庫關鍵區段 | Worker 自行選擇安全點 |
| Context Switch 代價 | 高 (User/Kernel 模式切換) | 低 (減少不必要切換) |
| 適用場景 | 通用多工 | 資料庫高併發、短任務 |
SQLOS 相信內部執行緒會合作,僅在 Worker 主動 Yield 或阻塞 (鎖、I/O、等待) 時切換,大幅降低 Context Switch 頻率。
sys.dm_os_schedulers)max worker threads 控制 (預設自動計算,32/64 位不同公式)load_factor 分配至負載最低 Scheduler (連接記憶上次 Scheduler 作為 Hint,負載差 >20% 時忽略)非搶佔式排程關鍵在於**及時 Yield**,避免長任務佔用 CPU 導致其他 Worker 饑餓。主要 Yield 場景:
quantum_length_us),SOS_SCHEDULER_YIELD 等待類型來源執行擴展預存程序、Windows API、Log Growth (Zeroing) 等非 SQLOS 可控代碼時,必須切換至 Preemptive 模式:
對應等待類型前綴 PREEMPTIVE_*。
[Runnable Queue] → (Dispatch) → [RUNNING Worker]
↑ ↓
└── (Yield/Wait) ←──┘
| DMV | 用途 |
|---|---|
sys.dm_os_schedulers | Scheduler 狀態、負載、Quantum、Worker 計數 |
sys.dm_os_workers | Worker 狀態、關聯 Task、Scheduling 資訊 |
sys.dm_os_tasks | Task 狀態、類型、關聯 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 負載不均等進階效能問題。