Nous avons récemment rencontré un problème sur notre environnement HADR SQL Server 2014, où l'un des serveurs était à court de threads de travail.
Nous avons reçu le message:
Le pool de threads pour les groupes de disponibilité AlwaysOn n'a pas pu démarrer un nouveau thread de travail car il n'y a pas suffisamment de threads de travail disponibles.
J'ai déjà ouvert une autre question, pour obtenir une déclaration qui (je pensais) devrait m'aider à analyser le problème ( est-il possible de voir quel SPID utilise quel planificateur (thread de travail)? ). Bien que j'ai maintenant la requête pour trouver les threads qui utilisent le système, je ne comprends pas pourquoi ce serveur a manqué de threads de travail.
Notre environnement est le suivant:
- 4 Windows Server 2012 R2
- SQL Server 2014 Enterprise
- 24 processeurs -> 832 threads de travail
- 256 Go de RAM
- 12 groupes de disponibilité (global)
- 642 bases de données (global)
Ainsi, le serveur qui a rencontré le problème avait la configuration suivante:
- 5 groupes de disponibilité (3 primaires / 2 secondaires)
- 325 bases de données (127 primaires / 198 secondaires)
MAXDOP = 8
Cost Threshold for Parallelism = 50
- Le plan d'alimentation est défini sur "Haute performance"
Pour «résoudre» le problème, nous avons manuellement fait basculer un groupe de disponibilité sur le serveur secondaire. La configuration de ce serveur est maintenant:
- 5 groupes de disponibilité (2 primaires / 3 secondaires)
- 325 bases de données (77 primaires / 248 secondaires)
Je surveille les discussions disponibles avec cette déclaration:
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'
Normalement, le serveur dispose d'environ 250 à 430 threads de travail disponibles, mais lorsque le problème a commencé, il n'y avait plus de travailleurs.
Aujourd'hui, de nulle part, les travailleurs disponibles sont passés de 327 à 50, mais seulement pendant une minute, puis sont remontés à environ 400.
J'ai déjà vu l'autre question ( utilisation élevée du thread de travail HADR ) mais cela ne m'aide pas.
Notre système est resté stable pendant plus d'un an sans aucun problème. Nous n'avons eu aucun basculement ou autre changement majeur dans la distribution des bases de données.
Nous utilisons la «validation synchrone» entre les répliques. D'après ma compréhension, aucune compression n'est impliquée, voir Ajuster la compression pour le groupe de disponibilité dans la documentation.
Quelqu'un at-il une idée de ce qui utilise tous les threads de travail?
EDIT: Trouvé cette page où il y a beaucoup d'informations sur exactement ces problèmes http://www.techdevops.com/Article.aspx?CID=24