Hold on hold on hold on
Sebbene gli aspetti relativi alle prestazioni e alle licenze siano interessanti, non sono l'unico aspetto di un carico di lavoro da considerare.
Una cosa che può avere un impatto sulla scelta del processore sono i thread di lavoro.
Discussioni sui lavoratori?
Yeah amico! Sono le cose che verranno utilizzate da SQL Server per eseguire le query e eseguire tutte le operazioni in background necessarie per mantenere le cose in forma.
Quando esaurisci i thread di lavoro, premi THREADPOOL attende
ThreadPool?
ThreadPool. Questa è una delle attese più cattive che puoi avere sul tuo server, insieme a RESOURCE_SEMAPHORE e RESOURCE_SEMAPHORE_QUERY_COMPILE . Ma quelli sono attese di memoria, e questa è una domanda sulla CPU.
Quindi torniamo al perché questo è Wiggity Wack.
Ecco come SQL Server calcola i thread di lavoro :
Notate come raddoppiare il numero di core non raddoppi i thread Max Worker e ottenete lo stesso numero con 1 core come con 4 core? L'equazione è:512 + ((logical CPUs - 4) * 16)
È un peccato, perché quando i conteggi dei core salgono, la velocità di clock di solito si aggira intorno a una o due generazioni indietro.
Dando un'occhiata a qualsiasi linea recente di chip Intel mostrerà una tendenza simile.
Come faccio a sapere di quanti thread ho bisogno?
Questo dipenderà molto da:
- Numero di utenti
- Numero di query parallele
- Numero di query seriali
- Numero di database e sincronizzazione dei dati (Mirroring, AG, backup per Log Log)
- Se si lasciano MAXDOP e CTFP alle impostazioni predefinite
Se oggi non ti stai esaurendo, probabilmente stai bene.
Ma come fai a sapere se lo sei?
Ci sono buone domande, e ci sono grandi domande, e lascia che ti dica qualcosa, questa è UNA GRANDE DOMANDA .
THREADPOOL può manifestarsi come problemi di connessione e potresti visualizzare messaggi nel registro degli errori in merito alla mancata generazione di un thread .
Puoi anche guardare le statistiche di attesa del tuo server usando uno strumento gratuito come sp_Blitz o sp_BlitzFirst (divulgazione completa, contribuisco a questo progetto).
EXEC sp_Blitz
EXEC sp_BlitzFirst @SinceStartup = 1
Non posso semplicemente aumentare il numero massimo di thread di lavoro?
L'aumento del MWT può comportare un aumento delle SOS_SCHEDULER_YIELD
attese.
Non è la fine del mondo, ma pensaci come aggiungere un buncha urlando i bambini alla lezione di un insegnante.
All'improvviso, sarà più difficile per ogni bambino attirare l'attenzione.
Quando un processo esaurisce il suo quantum di 4 ms , potenzialmente ci saranno più thread davanti ad esso in attesa di entrare nella CPU.
Le prestazioni potrebbero essere più o meno le stesse.
Come posso usare meno thread di lavoro?
Tu crudele [sostantivo] di un [sostantivo], quelli sono lavoratori con famiglie da sostenere! Mutui! Sogni!
Ma va bene, devo rispettare la linea di fondo. Sei il capo.
Il punto più semplice da cui iniziare è cambiare le impostazioni come MAXDOP e Cost Threshold For Parallelism dai valori predefiniti.
Se hai domande su come impostarle, vai qui:
Successivamente, il tuo lavoro diventa molto più difficile. Devi capire cosa sta usando tutti quei thread. A volte puoi farlo guardando le tue statistiche di attesa.
Più specificamente, se hai attese elevate sul parallelismo ( CXPACKET
) E attese elevate sui blocchi ( LCK_
), allora potresti imbatterti in lunghe catene di blocco che coinvolgono query parallele.
Sai cosa puzza? Mentre tutte quelle query parallele sono in attesa di ottenere i loro blocchi, non restituiscono i thread allocati.
Puoi quasi sentire quella macchina virtuale a quattro core che il tuo amministratore ti ha assicurato che era più che sufficiente per qualsiasi carico di lavoro senza fiato, eh?
Sfortunatamente, il tipo di query e ottimizzazione dell'indice che devi fare per risolvere quel problema va oltre lo scopo della domanda.
Spero che sia di aiuto!