it-swarm.com.de

SQL Server mit THREADPOOL wartet, während noch genügend Mitarbeiter verfügbar sind

Ich habe mir kürzlich die kumulativen Threadpool-Wartezeiten meines Produktions-SQL Servers angesehen, und es sind buchstäblich Tage voller Wartezeiten. Also fing ich an zu graben.

Ich bin auf einem 32-Kern-64-Bit-Server (läuft auf EC2). Max Worker ist in der Konfiguration korrekt auf 0 gesetzt, und die folgende DMV meldet die korrekte, erwartete Anzahl:

SELECT max_workers_count FROM sys.dm_os_sys_info

Output: 960

Wenn ich meine Gesamtzahl der Arbeiter betrachte, sehe ich selten mehr als 300-400:

SELECT count(*) FROM sys.dm_os_workers

Output: 372

Und doch, wenn ich die folgende DMV starte, habe ich immer Threads aufgelistet:

SELECT * FROM sys.dm_os_waiting_tasks
WHERE wait_type = 'THREADPOOL'

(Waiting Tasks -- Threadpool

SELECT dow.state , dow.is_preemptive , dow.is_sick , dow.is_in_polling_io_completion_routine , [Num Workers] = COUNT(1) 
FROM sys.dm_os_workers dow 
GROUP BY dow.state , dow.is_preemptive , dow.is_sick , dow.is_in_polling_io_completion_routine;

(enter image description here

Die Wartezeiten in Millisekunden sind normalerweise ziemlich kurz, im Allgemeinen 20 bis 200 ms, und sie verschwinden ebenfalls schnell, aber sie tragen zur gesamten kumulierten Threadpool-Zahl bei. Sie haben auch nie Blockierungssitzungen.

Ich bin ratlos darüber, warum irgendetwas auf einen Threadpool stößt, wenn ich so viele verfügbare Arbeiter habe. Sollten die Hunderte verfügbarer Mitarbeiter diese Anforderungen nicht sofort bearbeiten, ohne dass Threads in den Threadpool gelangen?

Ich würde mich über jede Eingabe oder Richtung hier freuen.

SQL Server-Version: SQL Server 2016 (SP2-CU8) (KB4505830) - 13.0.5426.0 (X64) Enterprise Edition: (64-Bit) unter Windows Server 2016 Datacenter 10.0 (Build 14393 :) (Hypervisor)

6
Mike P.

Wenn Sie maximaler Parallelitätsgrad auf Null gesetzt haben, was die Standardeinstellung ist, verbrauchen Abfragen, die von Parallelität profitieren könnten, 32 Threads. Wenn die Anzahl der Worker auf 960 festgelegt ist, was wiederum die Standardeinstellung für Ihr Setup ist, können Sie nur 30 parallele parallele Abfragen gleichzeitig ausführen.

Ich würde Einstellung des maximalen Parallelitätsgrades auf etwas Vernünftiges wie 8 empfehlen.

3
Max Vernon