理解 SQL Server 的執行緒模型,是診斷高併發阻塞、CPU 壓力、排程器壓力的前提。本文深入剖析 UMS(User Mode Scheduler)、Worker Thread、Fiber 模式、執行緒池配置與親和性遮罩,並提供實務調優指引。
| 概念 | 描述 | 管理者 | 切換成本 |
|---|---|---|---|
| Thread (執行緒) | OS 核心排程單元,SQL Server 早期 1:1 綁定連線 | OS Kernel | 高(User ↔ Kernel 模式切換) |
| Fiber (纖程) | Thread 內的用戶態輕量排程單元,多 Fiber 共用 1 Thread | SQL Server UMS | 極低(純用戶態切換,無 Kernel 介入) |
| Worker (工作項) | 邏輯執行單元,可映射至 Thread 或 Fiber | SQL Server | — |
max worker threads 控制(預設 0 = 自動,約 512 + 16 * CPU 核心數)。sp_configure 'lightweight pooling', 1。限制: 不支援 CLR、某些擴展預存程序、SQL Server Express/Standard 版本;Windows 9x 不支援。
-- 查看目前 Worker 狀態
SELECT
scheduler_id,
current_tasks_count,
runnable_tasks_count,
work_queue_count,
load_factor
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE';
任務送入時:
THREADPOOL 等待類型| 選項 | 功能 | 建議值 | 修改方式 |
|---|---|---|---|
| lightweight pooling | 啟用 Fiber 模式 | 0 (關閉),除非極高併發且 CPU 為瓶頸 | sp_configure 'lightweight pooling', 1; RECONFIGURE |
| max worker threads | 最大 Worker 數 | 0 (自動),64 位元通常足夠;32 位元受 VAS 限制可能需調降 | 屬性 → 處理器 / sp_configure |
| affinity mask | CPU 親和性,綁定特定核心 | 預設 0 (全部);僅在多實例隔離或 NUMA 微調時使用 | 屬性 → 處理器 → 處理器親和性 |
| max degree of parallelism (MAXDOP) | 單一查詢最大平行度 | OLTP: 1~4;OLAP: 0 (全核心) 或核心數/2 | 屬性 → 處理器 / 查詢提示 OPTION (MAXDOP n) |
-- 1. 偵測 THREADPOOL 等待(Worker 耗盡)
SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type = 'THREADPOOL';
-- 2. 排程器負載不均(NUMA 節點傾斜)
SELECT parent_node_id AS NUMA_Node, scheduler_id, current_tasks_count, runnable_tasks_count, load_factor
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE'
ORDER BY parent_node_id, load_factor DESC;
-- 3. 查詢並行度實際使用
SELECT
qs.max_dop,
qs.execution_count,
qs.total_worker_time / qs.execution_count AS avg_cpu_ms,
qs.total_elapsed_time / qs.execution_count AS avg_elapsed_ms
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE qs.max_dop > 1
ORDER BY avg_cpu_ms DESC;
max worker threads(謹慎,會增加記憶體壓力)。affinity mask 將實例綁定特定 NUMA 節點,或啟用 trace flag 8048(SQL 2014+)將分區鎖提升至 NUMA 節點層級。OPTION (MAXDOP 1) 強制序列執行、優化統計資訊避免錯誤平行計畫。掌握執行緒架構,才能從根源解決「CPU 明明不高卻卡頓」、「連線數不多卻報 THREADPOOL」等反直覺現象。