Utilizzo della CPU molto irregolare con SQL Server 2012 su computer con 2 processori con 16 core / processore


8

Dopo aver installato SQL Server Enterprise 2012 con il modello di licenza Server + Cal, su un computer con 2 processori ciascuno con 16 core (e nessun hyperthreading coinvolto) e messo il server sotto carico estremamente pesante, i 16 core sul primo processore erano molto sottoutilizzati, il i primi 4 core sulla seconda CPU sono stati ampiamente utilizzati e gli ultimi 12 core non sono stati utilizzati affatto (a causa del limite di 20 core per questa versione del server sql). L'utilizzo totale della CPU è stato del 25% circa. Sfortunatamente, il server ha sofferto di prestazioni estremamente scarse, anche se se le attività fossero state distribuite uniformemente tra i 20 core non sarebbe stato altrettanto negativo.

Il server Windows era in esecuzione su un'immagine virtuale VMWare in ESX Server, ma tutta la CPU era allocata al server Windows.

Abbiamo provato a modificare le impostazioni di affinità (ad es. Allocando la maggior parte dei core alla CPU e gli altri all'I / O), ma ciò non ha aiutato a risolvere i problemi di prestazioni.

L'aggiornamento dell'edizione del prodotto a SQL Server Enterprise Core 2012 non solo ha consentito a SQL Server di utilizzare i 12 core precedentemente non utilizzati sul secondo processore, ma ha anche portato a una distribuzione molto più uniforme delle attività su tutti i processori. Per superare l'arretrato di richieste, l'utilizzo della cpU è balzato al 90% circa, per poi ridursi al 33% circa una volta raggiunto, ma le prestazioni sono migliorate notevolmente dal momento che non siamo riusciti a passare alla versione appena aggiornata e i problemi di prestazioni sono scomparsi.

Mi chiedevo se qualcuno sapesse cosa potrebbe causare una distribuzione non uniforme del carico da parte di SQL Server, basandosi quasi esclusivamente sui primi 4 core del secondo processore con 12 core inattivi e assegnando solo alcune attività a ciascuno dei 16 core sul primo processore. Inoltre, esiste un modo per distribuire il carico in modo più uniforme tra i 20 core utilizzati senza l'aggiornamento dell'edizione del prodotto?

Il rovescio della medaglia di questa domanda è che cosa ha fatto l'aggiornamento del prodotto che ha fatto sì che SQL Server iniziasse a distribuire uniformemente il carico su tutti i core riconosciuti?

Grazie a qualsiasi intuizione per rispondere a queste domande e / o collegamenti che potrebbero aiutarmi a capire meglio come dare un senso a ciò che stava accadendo.


Stai dicendo che la macchina in questione è una VM con 32 vCPU? In entrambi gli scenari?
mfinni,

Sì, era la stessa macchina che aveva 2 processori, ognuno con 16 core (e non era coinvolto l'hyperthreading).
cooplarsh

1
Perché nel nome di THE LORD hai 32 vCPU? Hai provato a ridurlo? So che ESXi ha migliorato la pianificazione delle bande di CPU, ma stai solo chiedendo problemi con così tante persone. Su quale versione di ESXi sei e qual è l'hardware sottostante?
mfinni,

Risposte:


4

Le prestazioni irregolari erano probabilmente una combinazione del limite di 20 core combinato con il modo in cui il server sql pianifica i thread su macchine NUMA. Sfortunatamente, SQL Server 2012 non utilizza alcuna intelligenza per decidere quali 20 core utilizzare, determinando un numero sbilanciato di core per nodo NUMA. Con 32 core distribuiti su 2 nodi NUMA, probabilmente finirai con una divisione 16/4. Questo è problematico perché SQL proverà a bilanciare le attività equamente tra i nodi NUMA in modo round robin (supponendo che non stai forzando l'affinità con il governatore delle risorse).

Nel tuo caso, 1/2 del carico è assegnato a 4 core e da 1/2 a 16 core. Il collo di bottiglia sul nodo a 4 core agisce effettivamente come un throttle, limitando la capacità della macchina a 2x 4 core = 8 core = 25% di utilizzo della CPU.

Una volta aggiornato all'edizione core, sql ha utilizzato tutti i 32 core su 2 nodi numa (suddivisione 16/16). Prestazioni migliorate, ecc.

Un'opzione che avrebbe potuto migliorare le prestazioni sarebbe stata quella di utilizzare il governor delle risorse del server sql per affinare la maggior parte del carico di lavoro su un nodo numa. Ad esempio, è possibile creare un pool di risorse WEB_APP e affinarlo per l'esecuzione solo sul nodo numa a 16 core. Il carico assegnato al pool WEB_APP potrebbe utilizzare il 50% della capacità del server, oltre alla restante capacità del 12,5% dal nodo a 4 core.

L'altra opzione sarebbe limitare i core disponibili al server sql a essere solo 10 da ciascun nodo numa.

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.