Niedawno mieliśmy problem z naszym środowiskiem HADR programu SQL Server 2014, w którym na jednym z serwerów zabrakło wątków roboczych.
Dostaliśmy wiadomość:
Pula wątków dla grup dostępności AlwaysOn nie mogła rozpocząć nowego wątku roboczego, ponieważ nie ma wystarczającej liczby dostępnych wątków roboczych.
Otworzyłem już inne pytanie, aby uzyskać stwierdzenie, które (myślałem) powinno mi pomóc w analizie problemu ( czy można zobaczyć, który SPID używa który harmonogram (wątek roboczy)? ). Chociaż mam teraz zapytanie o znalezienie wątków korzystających z systemu, nie rozumiem, dlaczego na tym serwerze zabrakło wątków roboczych.
Nasze środowisko jest następujące:
- 4 Windows Server 2012 R2
- SQL Server 2014 Enterprise
- 24 procesory -> 832 wątków roboczych
- 256 GB pamięci RAM
- 12 grup dostępności (ogólnie)
- 642 bazy danych (ogólnie)
Serwer, który miał problem, miał następującą konfigurację:
- 5 grup dostępności (3 podstawowe / 2 dodatkowe)
- 325 baz danych (127 podstawowych / 198 wtórnych)
MAXDOP = 8
Cost Threshold for Parallelism = 50
- Plan zasilania jest ustawiony na „Wysoka wydajność”
Aby „rozwiązać” problem, ręcznie nie udało się przełączyć jednej grupy dostępności na serwer pomocniczy. Konfiguracja tego serwera jest teraz:
- 5 grup dostępności (2 podstawowe / 3 dodatkowe)
- 325 baz danych (77 podstawowych / 248 wtórnych)
Monitoruję dostępne wątki za pomocą tego oświadczenia:
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'
Zwykle na serwerze dostępnych jest około 250–430 wątków roboczych, ale gdy problem się zaczął, nie było już żadnych pracowników.
Dzisiaj, znikąd, liczba dostępnych pracowników spadła z 327 do 50, ale tylko na minutę, a następnie wróciła do około 400.
Widziałem już inne pytanie ( użycie wątku HADR o wysokim obciążeniu procesu roboczego ), ale to mi nie pomaga.
Nasz system działał stabilnie przez ponad rok bez żadnych problemów. Nie mieliśmy żadnych przełączeń awaryjnych ani innych poważnych zmian w dystrybucji baz danych.
Używamy „synchronicznego zatwierdzenia” między replikami. Z mojego zrozumienia nie jest wymagana żadna kompresja, zobacz temat Dostrajanie kompresji dla grupy dostępności w dokumentacji.
Czy ktoś ma pojęcie, co wykorzystuje wszystkie wątki robocze?
EDYCJA: Znalazłem tę stronę, na której jest wiele informacji na temat dokładnie tych problemów http://www.techdevops.com/Article.aspx?CID=24