Hur man löser problem med Max Worker Threads i SQL Server

Innan vi diskuterar prestationsfrågor relaterade tillMax arbetstrådar(MWT), låt oss förstå vadMWTgör.MWTär arbetartrådar tillgängliga för SQL Server och med de inbyggda Windows-trådarna hanterar SQL Server samtidigt flera uppgifter parallellt. Till exempel databaskontrollpunkter, nätverkslagerprocesser, hantering av transaktionsbearbetning etc. Standardvärdet är 0. Värdet 0 tillåter SQL Server att skapa trådar baserade på serverresurser dynamiskt. Det fungerar för majoriteten av SQL Server-distributionen över hela världen. För att förbättra prestandan kan det ibland hjälpa att öka MWT-värdet manuellt. I det här inlägget kommer jag att prata om hur man löser problem med max worker threads i SQL Server.

Du kommer bara att få slut på MWT när SQL Server är mycket upptagen, hög användarsamfällighet och ytterligare funktioner som SQL Server Always On, Replication Services är aktiverade. Baserat på SQL Server-versioner (32 bitar eller 64 bitar) och processorkärnor skapas en pool av arbetartrådar av SQL Server för att betjäna användarförfrågningar. Här är en snabb titt på de svåra siffrorna.

Antal CPU-kärnorÄldre 32-bitarsservrarSenaste 64-bitarsservrarna
Upp till 4 processorer256512
Octa-Core 8-processorer288576
16 processorer352704
32 processorer480960
64 processorer7361472
128 processorer42244480
256 processorer83208576

Alternativet MWT Configuration exkluderar trådar som används för Always On Availability Groups och Database Mirroring.

Använd följande fråga för att ta reda på vilka systemuppgifter som har orsakat att ytterligare arbetstrådar skapas:

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;

Hur man ändrar antalet Max Worker Threads med 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

Ibland förbättrar prestanda genom att minska antalet arbetstrådar

Rekommenderad läsning:Hur man gör SQL Server Hybrid Backup till URL på Azure Storage under 2019

Max Worker Threads bästa praxis för databasspegling och alltid tillgängliga grupper

  • För att undvika MWT-utmattning, skapa inte mer än 10 tillgänglighetsgrupper och 100 databaser. Detta innebär 10 DB:s per tillgänglighetsgrupp. Detta är en rekommendation och inte en hård gräns.
  • Om det finns en MWT-utmattning, lägg till ytterligare processorer eller virtuella processorer (i fallet med virtuella maskiner) för att öka antalet MWT. Se tabellen ovan för referens.
  • Att skapa en annan instans på samma server för att förbättra MWT kommer inte att öka prestandan.
  • För mycket databaskonsolidering med databaser som kör spegling och tillgänglighetsgrupper kan orsaka MWT-utmattning.
  • Beräkna Max MWT och testa systemet noggrant innan du alltid implementerar på AG.

Hur beräknar man MWT Count?

MWT = {512 + ((Number of CPU Cores - 4) * 16)} = Result

Hur man beräknar maximal användning av arbetstrådar

select scheduler_id,current_tasks_count,

current_workers_count,active_workers_count,work_queue_count    

from sys.dm_os_schedulers    

where status = ‘Visible Online’

Uppdelning av vilken systemuppgift som använder MWT-trådar

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

Officiella onlineresurser från Microsoft