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-Server | Neueste 64-Bit-Server |
|---|---|---|
| Bis zu 4 Prozessoren | 256 | 512 |
| Octa-Core 8-Prozessoren | 288 | 576 |
| 16 Prozessoren | 352 | 704 |
| 32 Prozessoren | 480 | 960 |
| 64 Prozessoren | 736 | 1472 |
| 128 Prozessoren | 4224 | 4480 |
| 256 Prozessoren | 8320 | 8576 |
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)} = ResultSo 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
Erfahren Sie mehr überMax. Worker-Threads Option
- Erfahren Sie mehr überSQL Server Always On-Einschränkungen
