Chi sta usando i miei thread di lavoro? SQL Server 2014 - HADR


10

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.

Messaggio di errore all'avvio

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.

-119 discussioni disponibili

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

Risposte:


1

Risposta wiki della community :

Hai un numero elevato di database nei gruppi di disponibilità, sarà dove stanno andando i tuoi thread. La compressione, la crittografia e i costi di trasporto implicano molto. Prova a disattivare la compressione, ridurrà l'utilizzo del thread di circa un terzo (a seconda del conteggio delle repliche).

La domanda è contrassegnata con SQL Server 2014, che per impostazione predefinita utilizzerà la compressione. SQL Server 2016, per impostazione predefinita, non utilizzerà la compressione per la sincronizzazione.

Potrebbe essere necessario aumentare i thread di lavoro sull'istanza o meglio: bilanciare quelli più attivi e quelli inattivi su più server. Vedere la relativa query sul gruppo di disponibilità AlwaysON relativa molto lentamente .

Potresti anche scoprire che è un'applicazione che non è in grado di chiudere correttamente le richieste. Ciò può comportare molte sessioni di sonno in giro (che consumano lavoratori).

Il numero di thread effettivamente utilizzati dipende da quanto sono attivi i database. Potresti avere 1.000 database e, se la maggior parte è inattivo il 95% delle volte, non avrai problemi. Sembra che i tuoi database siano diventati attivi più spesso e abbiano consumato più thread. Questo è il lungo e breve.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.