如何解決SQL Server中的最大工作線程問題

在討論與最大工人線程(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位服務器
最新處理器256512
八核8處理器288576
16個處理器352704
32個處理器480960
64個處理器7361472
128個處理器42244480
256個處理器83208576

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

Microsoft的官方在線資源