Di recente abbiamo riscontrato un problema nel nostro ambiente HADR di SQL Server 2014, in cui uno dei server ha esaurito i thread di lavoro.
Abbiamo ricevuto il messaggio:
Il pool di thread per i gruppi di disponibilità AlwaysOn non è stato in grado di avviare un nuovo thread di lavoro perché non vi sono abbastanza thread di lavoro disponibili.
Ho già aperto un'altra domanda, per ottenere un'affermazione che (ho pensato) dovrebbe aiutarmi ad analizzare il problema ( è possibile vedere quale SPID utilizza quale scheduler (thread di lavoro)? ). Anche se ora ho la query per trovare i thread che utilizzano il sistema, non capisco perché quel server abbia esaurito i thread di lavoro.
Il nostro ambiente è il seguente:
- 4 Windows Server 2012 R2
- SQL Server 2014 Enterprise
- 24 processori -> 832 thread di lavoro
- Ram da 256 GB
- 12 gruppi di disponibilità (complessivi)
- 642 database (complessivo)
Quindi, il server che presentava il problema aveva la seguente configurazione:
- 5 gruppi di disponibilità (3 primario / 2 secondario)
- 325 database (127 primario / 198 secondario)
MAXDOP = 8
Cost Threshold for Parallelism = 50
- Il piano di alimentazione è impostato su "Prestazioni elevate"
Per "risolvere" il problema abbiamo fallito manualmente un gruppo di disponibilità sul server secondario. La configurazione di quel server è ora:
- 5 gruppi di disponibilità (2 primari / 3 secondari)
- 325 database (77 primario / 248 secondario)
Sto monitorando i thread disponibili con questa affermazione:
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'
Normalmente il server ha circa 250 - 430 thread di lavoro disponibili, ma quando il problema è iniziato non sono rimasti più lavoratori.
Oggi, dal nulla, i lavoratori disponibili sono scesi da 327 a 50, ma solo per un minuto e poi risaliti a circa 400.
Ho già visto l'altra domanda ( utilizzo elevato del thread di lavoro HADR ) ma non mi aiuta.
Il nostro sistema è rimasto stabile per oltre un anno senza problemi. Non abbiamo avuto alcun failover o altri importanti cambiamenti nella distribuzione dei database.
Stiamo usando il "commit sincrono" tra le repliche. Da quanto ho capito, non è implicata alcuna compressione, vedere Ottimizza la compressione per il gruppo di disponibilità nella documentazione.
Qualcuno ha un'idea di cosa sta usando tutti i thread di lavoro?
EDIT: ho trovato questa pagina in cui ci sono molte informazioni su esattamente questi problemi http://www.techdevops.com/Article.aspx?CID=24