Wir hatten kürzlich ein Problem in unserer SQL Server 2014-HADR-Umgebung, in der einem der Server die Arbeitsthreads ausgegangen sind.
Wir haben die Nachricht erhalten:
Der Thread-Pool für AlwaysOn-Verfügbarkeitsgruppen konnte keinen neuen Worker-Thread starten, da nicht genügend Worker-Threads verfügbar sind.
Ich habe bereits eine andere Frage geöffnet, um eine Erklärung zu erhalten, die mir (ich dachte) helfen sollte, das Problem zu analysieren ( Ist es möglich zu sehen, welche SPID welchen Scheduler (Worker-Thread) verwendet? ). Obwohl ich jetzt die Abfrage habe, die Threads zu finden, die das System verwenden, verstehe ich nicht, warum diesem Server die Arbeitsthreads ausgegangen sind.
Unsere Umwelt ist wie folgt:
- 4 Windows Server 2012 R2
- SQL Server 2014 Enterprise
- 24 Prozessoren -> 832 Worker-Threads
- 256 GB RAM
- 12 Verfügbarkeitsgruppen (insgesamt)
- 642 Datenbanken (insgesamt)
Der Server mit dem Problem hatte also die folgende Konfiguration:
- 5 Verfügbarkeitsgruppen (3 primäre / 2 sekundäre)
- 325 Datenbanken (127 Primär / 198 Sekundär)
MAXDOP = 8
Cost Threshold for Parallelism = 50
- Der Energieplan ist auf "Hohe Leistung" eingestellt.
Um das Problem zu "beheben", haben wir eine Verfügbarkeitsgruppe manuell auf den sekundären Server übertragen. Die Konfiguration dieses Servers lautet jetzt:
- 5 Verfügbarkeitsgruppen (2 primäre / 3 sekundäre)
- 325 Datenbanken (77 primäre / 248 sekundäre)
Ich überwache die verfügbaren Threads mit dieser Anweisung:
declare @max int
select @max = max_workers_count from sys.dm_os_sys_info
select
@max as 'TotalThreads',
sum(active_Workers_count) as 'CurrentThreads',
@max - sum(active_Workers_count) as 'AvailableThreads',
sum(runnable_tasks_count) as 'WorkersWaitingForCpu',
sum(work_queue_count) as 'RequestWaitingForThreads' ,
sum(current_workers_count) as 'AssociatedWorkers'
from
sys.dm_os_Schedulers where status='VISIBLE ONLINE'
Normalerweise stehen auf dem Server etwa 250 bis 430 Arbeitsthreads zur Verfügung, aber als das Problem begann, waren keine Arbeiter mehr übrig.
Heute sind die verfügbaren Arbeitskräfte aus dem Nichts von 327 auf 50 gesunken, aber nur für eine Minute, und sind dann wieder auf rund 400 gestiegen.
Ich habe bereits die andere Frage gesehen ( HADR High Worker Thread-Nutzung ), aber sie hilft mir nicht.
Unser System lief über ein Jahr ohne Probleme stabil. Wir hatten kein Failover oder andere wesentliche Änderungen in der Verteilung der Datenbanken.
Wir verwenden "Synchronous Commit" zwischen den Replikaten. Nach meinem Verständnis ist keine Komprimierung erforderlich. Weitere Informationen finden Sie in der Dokumentation unter Komprimierung für Verfügbarkeitsgruppe optimieren.
Hat jemand eine Idee, was alle Worker-Threads verwendet?
BEARBEITEN: Auf dieser Seite finden Sie viele Informationen zu genau diesen Themen. Http://www.techdevops.com/Article.aspx?CID=24