Kilka miesięcy temu miałem do czynienia z podobną sytuacją, w której ustawienie MAXDOP było domyślne, a zapytanie ucieczki wyczerpało wszystkie wątki robocze.
Jak zauważył Remus, nazywa się to głodem nici robotniczej .
Po wystąpieniu tego warunku na serwerze zostanie utworzony zrzut pamięci.
Jeśli korzystasz z wersji 2008R2 + SP1 i nowszej, sys.dm_server_memory_dumps
poda również lokalizację pliku zrzutu.
Wróćmy do problemu:
Na jeden węzeł NUMA przypada 1 wątek monitorowania harmonogramu, a ponieważ masz 2 węzły NUMA, będą 2 wątki monitorowania harmonogramu, które są odpowiedzialne za sprawdzanie kondycji wszystkich programów planujących co 60 sekund dla tego konkretnego węzła NUMA, upewniając się, że harmonogram jest zablokowany lub nie.
Za każdym razem, gdy nowe żądanie pracy jest pobierane z kolejki roboczej programu planującego, licznik procesów roboczych jest zwiększany. Jeśli więc harmonogram ma w kolejce żądanie pracy i nie przetworzy jednego z żądań pracy w ciągu 60 sekund, harmonogram zostanie uznany za zablokowany.
Z powodu uciekającego zapytania lub rozległego paralelizmu powstaje stan wyczerpania wątków roboczych, ponieważ wszystkie wątki są zajęte przez to pojedyncze uciekające zapytanie lub nadmierne przedłużone blokowanie i nie można wykonać żadnej pracy, chyba że zginie proces obrażający.
Najlepszym rozwiązaniem jest dostrojenie ustawienia Max Degree of Parallelism . Domyślnie 0
oznacza, że SQL Server może wykorzystywać wszystkie dostępne procesory do przetwarzania równoległego i tam, wyczerpując wszystkie wątki robocze.
Istnieje wiele przyczyn, które mogą prowadzić do wyczerpania wątków roboczych:
- Długie łańcuchy blokujące powodują, że SQL Serverowi brakuje wątków roboczych
- Szeroki paralelizm prowadzi również do wyczerpania wątków roboczych
- Długie oczekiwanie na każdy rodzaj „zamka” - spinlocki, zatrzaski. Przykładem jest osierocona blokada.
Zapoznaj się z moją odpowiedzią tutaj , która pokaże Ci, jak obliczyć wartość MAXDOP dla instancji serwera.
Ponadto zdecydowanie zalecamy rozpoczęcie zbierania informacji o statystykach Wait dotyczących instancji serwera bazy danych.
max degree of parallelism
skonfigurowanych i ile procesorów aktualnie masz na serwerze wraz z konfiguracją NUMA? Można skorzystaćcoreinfo.exe
z sysinternals aby dowiedzieć się liczby procesorów i konfiguracji NUMA.