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-bitarsservrar | Senaste 64-bitarsservrarna |
|---|---|---|
| Upp till 4 processorer | 256 | 512 |
| Octa-Core 8-processorer | 288 | 576 |
| 16 processorer | 352 | 704 |
| 32 processorer | 480 | 960 |
| 64 processorer | 736 | 1472 |
| 128 processorer | 4224 | 4480 |
| 256 processorer | 8320 | 8576 |
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)} = ResultHur 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
Lär dig mer ommax arbetstrådar Alternativ
- Lär dig mer omSQL Server alltid på begränsningar
