在討論與最大工人線程(MWT),讓我們了解什麼MWT做。MWT是可用於SQL Server的Worker線程以及使用本機Windows線程SQL Server同時處理多個任務。例如,數據庫檢查點,網絡層進程,處理事務處理等。默認值為0。0值允許SQL Server動態基於服務器資源來衍生線程。它適用於全球大多數SQL Server部署。為了提高性能,有時手動提高MWT值有幫助。在這篇文章中,我將討論如何解決SQL Server中的最大工作線程問題。
您只有在SQL Server非常忙,高用戶並發和SQL Server(例如SQL Server始終打開)的其他功能時,您才能用盡MWT。基於SQL Server版本(32位或64位)和處理器內核,SQL Server催生了一組工作用戶線程來服務用戶請求。這是一個快速查看的硬數字。
CPU核心計數 | 舊32位服務器 | 最新的64位服務器 |
---|---|---|
最新處理器 | 256 | 512 |
八核8處理器 | 288 | 576 |
16個處理器 | 352 | 704 |
32個處理器 | 480 | 960 |
64個處理器 | 736 | 1472 |
128個處理器 | 4224 | 4480 |
256個處理器 | 8320 | 8576 |
MWT配置選項不包括始終在可用性組和數據庫鏡像上使用的線程。
使用以下查詢來找出哪些系統任務導致了額外的工作線程:
SELECT s.session_id, r.command, r.status, r.wait_type, r.scheduler_id, w.worker_address, w.is_preemptive, w.state, t.task_state, t.session_id, t.exec_context_id, t.request_id FROM sys.dm_exec_sessions AS s INNER JOIN sys.dm_exec_requests AS r ON s.session_id = r.session_id INNER JOIN sys.dm_os_tasks AS t ON r.task_address = t.task_address INNER JOIN sys.dm_os_workers AS w ON t.worker_address = w.worker_address WHERE s.is_user_process = 0;
如何使用t-sql更改最大工人線程計數
USE AdventureWorks2016 ; GO EXEC sp_configure 'show advanced options', 1; GO RECONFIGURE ; GO EXEC sp_configure 'max worker threads', 1000 ; GO RECONFIGURE; GO
有時,減少工人線程計數會提高性能
最大工作線程數據庫鏡像的最佳實踐以及始終在可用性組上
- 為了避免MWT疲憊,請勿創建超過10個可用性組和100個數據庫。這意味著,10 dB的每個可用性組。這是一個建議,而不是硬限制。
- 如果有MWT耗盡,請添加其他CPU或虛擬CPU(對於虛擬機)以增加MWT計數。請參閱上表以獲取參考。
- 在同一服務器上創建另一個實例以改善MWT不會提高性能。
- 與運行鏡像的數據庫和可用性組的數據庫合併過多會導致MWT耗盡。
- 在始終在AG上實施之前,計算最大MWT並廣泛測試系統。
如何計算MWT計數?
MWT = {512 + ((Number of CPU Cores - 4) * 16)} = Result
如何計算最大工人線程使用
select scheduler_id,current_tasks_count, current_workers_count,active_workers_count,work_queue_count from sys.dm_os_schedulers where status = ‘Visible Online’
分解哪個系統任務使用MWT線程
select is_preemptive,state,last_wait_type,count(*) as NumWorkers from sys.dm_os_workers Group by state,last_wait_type,is_preemptive order by count(*) desc