So lösen Sie Probleme mit der maximalen Anzahl an Worker-Threads in SQL Server

Bevor wir Leistungsprobleme im Zusammenhang mit besprechenMax. Worker-Threads(MWT), lasst uns verstehen, wasMWTtut.MWTsind Arbeitsthreads, die für SQL Server verfügbar sind. Mithilfe der nativen Windows-Threads verarbeitet SQL Server gleichzeitig mehrere Aufgaben parallel. Zum Beispiel Datenbankprüfpunkte, Netzwerkschichtprozesse, Abwicklung der Transaktionsverarbeitung usw. Der Standardwert ist 0. Der Wert 0 ermöglicht SQL Server, Threads basierend auf Serverressourcen dynamisch zu erzeugen. Es funktioniert für den Großteil der SQL Server-Bereitstellungen weltweit. Um die Leistung zu verbessern, kann es manchmal hilfreich sein, den MWT-Wert manuell zu erhöhen. In diesem Beitrag werde ich darüber sprechen, wie Probleme mit der maximalen Anzahl von Arbeitsthreads in SQL Server behoben werden können.

Ihnen wird MWT nur dann ausgehen, wenn der SQL Server sehr ausgelastet ist, eine hohe Benutzergleichzeitigkeit besteht und zusätzliche Funktionen wie SQL Server Always On und Replikationsdienste aktiviert sind. Basierend auf SQL Server-Versionen (32 Bit oder 64 Bit) und Prozessorkernen wird von SQL Server ein Pool von Arbeitsthreads erzeugt, um Benutzeranfragen zu bearbeiten. Hier ein kurzer Blick auf die harten Zahlen.

Anzahl der CPU-KerneÄltere 32-Bit-ServerNeueste 64-Bit-Server
Bis zu 4 Prozessoren256512
Octa-Core 8-Prozessoren288576
16 Prozessoren352704
32 Prozessoren480960
64 Prozessoren7361472
128 Prozessoren42244480
256 Prozessoren83208576

Die Option „MWT-Konfiguration“ schließt Threads aus, die für Always On-Verfügbarkeitsgruppen und Datenbankspiegelung verwendet werden.

Verwenden Sie die folgende Abfrage, um herauszufinden, welche Systemaufgaben dazu geführt haben, dass zusätzliche Arbeitsthreads erzeugt wurden:

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;

So ändern Sie die Anzahl der maximalen Worker-Threads mit 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

Manchmal verbessert die Reduzierung der Worker-Thread-Anzahl die Leistung

VERWANDT:So teilen Sie eine Zeichenfolge mithilfe der Funktion STRING_SPLIT in SQL Server effektiv auf

Best Practices für maximale Worker-Threads für Datenbankspiegelung und Always-On-Verfügbarkeitsgruppen

  • Um eine MWT-Erschöpfung zu vermeiden, erstellen Sie nicht mehr als 10 Verfügbarkeitsgruppen und 100 Datenbanken. Das bedeutet 10 DBs pro Verfügbarkeitsgruppe. Dies ist eine Empfehlung und keine feste Grenze.
  • Wenn eine MWT-Erschöpfung vorliegt, fügen Sie zusätzliche CPUs oder virtuelle CPUs (im Fall von virtuellen Maschinen) hinzu, um die MWT-Anzahl zu erhöhen. Siehe die obige Tabelle als Referenz.
  • Das Erstellen einer weiteren Instanz auf demselben Server zur Verbesserung von MWT führt nicht zu einer Leistungssteigerung.
  • Eine zu starke Datenbankkonsolidierung mit Datenbanken, auf denen Spiegelung und Verfügbarkeitsgruppen ausgeführt werden, kann zu einer MWT-Erschöpfung führen.
  • Berechnen Sie die maximale MWT und testen Sie das System ausgiebig, bevor Sie es immer auf AG implementieren.

Wie berechnet man die MWT-Anzahl?

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

So berechnen Sie die maximale Worker-Thread-Nutzung

select scheduler_id,current_tasks_count,

current_workers_count,active_workers_count,work_queue_count    

from sys.dm_os_schedulers    

where status = ‘Visible Online’

Aufschlüsselung, welche Systemaufgabe MWT-Threads verwendet

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

Offizielle Online-Ressourcen von Microsoft