Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Problemi di prestazioni con SQL Server 2012 Enterprise Edition con licenza CAL

In SQL Server 2012 sono state introdotte numerose modifiche alle licenze; il più significativo è stato il passaggio dalla licenza basata su socket alla licenza basata su core per Enterprise Edition. Una delle sfide che Microsoft ha dovuto affrontare con questa modifica è stata fornire un percorso di migrazione per i clienti che in precedenza utilizzavano licenze basate su Server+CAL per Enterprise Edition prima di SQL Server 2012. I clienti con Software Assurance possono eseguire l'aggiornamento a SQL Server 2012 Enterprise Edition e continuare a utilizzare Server +Licenza CAL (nota anche come "nonno") ma con una limitazione a 20 processori logici, come documentato nella Guida alle licenze di SQL Server 2012. Questa licenza si estende anche alle macchine virtuali con un limite di 4 macchine virtuali coperte dalla licenza Enterprise Server+CAL, ma con la stessa limitazione di 20 processori logici come documentato nella Guida alle licenze di virtualizzazione di SQL Server 2012.

Molte persone sono state colte alla sprovvista dalla limitazione di 20 processori logici, anche se è documentata nelle guide alle licenze.

Viene inserita una voce nel file ERRORLOG all'avvio dell'istanza, specificando il numero di processori logici e che viene applicata la limitazione di 20 processori:

Data    14/11/2012 20:15:08
Registro     SQL Server (attuale:14/11/2012 20:17:00)
Server di origine
Messaggio
SQL Il server ha rilevato 2 socket con 16 core per socket e 16 processori logici per socket, 32 processori logici totali; utilizzando 20 processori logici basati sulla licenza di SQL Server. Questo è un messaggio informativo; Non è richiesta alcuna azione da parte dell'utente.

Con la configurazione predefinita applicata da SQL Server in base alla limitazione di 20 processori logici tramite Server+CAL, i primi 20 scheduler sono VISIBILI IN LINEA e tutti i restanti scheduler sono VISIBILI NON IN LINEA. Di conseguenza, possono verificarsi problemi di prestazioni per l'istanza, a causa degli squilibri del programma di pianificazione del nodo NUMA. Per dimostrarlo ho creato una VM sul nostro server di prova Dell R720 che ha due socket e processori Intel Xeon E5-2670 installati, ciascuno con 8 core e Hyperthreading abilitato, fornendo un totale di 32 processori logici disponibili in Windows Server 2012 Datacenter Edition. La VM è stata configurata per avere 32 CPU virtuali con 16 processori virtuali allocati in due nodi vNUMA.


Figura 1 – Impostazioni vNUMA

In SQL Server con il modello di licenza Enterprise Server+CAL, ciò si traduce in una configurazione dell'utilità di pianificazione simile alla seguente:

SELECT 
  parent_node_id,
  [status], 
  scheduler_id, 
  [cpu_id], 
  is_idle, 
  current_tasks_count, 
  runnable_tasks_count, 
  active_workers_count, 
  load_factor
FROM sys.dm_os_schedulers;


Figura 2 – Assegnazione dello scheduler in Enterprise Server+CAL

Come puoi vedere, l'istanza utilizza tutti i 16 processori logici nel primo nodo NUMA e solo quattro dei processori logici nel secondo nodo NUMA. Ciò si traduce in un significativo squilibrio degli scheduler tra i due nodi NUMA che può portare a notevoli problemi di prestazioni sotto carico. Per dimostrare ciò, ho creato 300 connessioni che eseguono il carico di lavoro della documentazione in linea di AdventureWorks sull'istanza e quindi ho acquisito le informazioni sull'utilità di pianificazione per le pianificazioni VISIBLE ONLINE nell'istanza utilizzando la query seguente:

SELECT 
  parent_node_id,
  scheduler_id, 
  [cpu_id], 
  is_idle, 
  current_tasks_count, 
  runnable_tasks_count, 
  active_workers_count, 
  load_factor
FROM sys.dm_os_schedulers
WHERE [status] = N'VISIBLE ONLINE';

Un esempio di output di questa query sotto carico è mostrato nella Figura 3 di seguito.


Figura 3 – Utilità di pianificazione sotto carico con Enterprise Server+CAL

Puoi anche vedere questo sintomo visivamente in strumenti di monitoraggio come SQL Sentry Performance Advisor:


Figura 4 – Squilibrio NUMA come mostrato in SQL Sentry Performance Advisor

Queste informazioni mostrano uno squilibrio significativo e di conseguenza le prestazioni ne risentiranno. Ciò è chiaramente evidente nei conteggi delle attività eseguibili per i quattro schedulatori nel secondo nodo NUMA, che sono da tre a quattro volte più grandi di quelli per gli schedulatori nel primo nodo NUMA. Quindi qual è esattamente il problema e perché si verifica?

A prima vista potresti pensare che questo sia un bug in SQL Server, ma non lo è. Questo è qualcosa che si verifica in base alla progettazione, anche se dubito che questo scenario fosse previsto quando è stata originariamente implementata la limitazione di 20 processori logici. Sui sistemi basati su NUMA, le nuove connessioni vengono assegnate ai nodi NUMA in modo round robin, quindi all'interno del nodo NUMA la connessione viene assegnata a uno scheduler in base al carico. Se cambiamo il modo in cui guardiamo questi dati e aggreghiamo i dati in base a parent_node_id, vedremo che le attività vengono effettivamente bilanciate tra i nodi NUMA. Per fare ciò utilizzeremo la query seguente, il cui output è mostrato nella Figura 5.

SELECT 
  parent_node_id, 
  SUM(current_tasks_count) AS current_tasks_count, 
  SUM(runnable_tasks_count) AS runnable_tasks_count, 
  SUM(active_workers_count) AS active_workers_count, 
  AVG(load_factor) AS avg_load_factor
FROM sys.dm_os_schedulers
WHERE [status] = N'VISIBLE ONLINE'
GROUP BY parent_node_id;


Figura 5 – Saldo round-robin del nodo NUMA

Questo comportamento è documentato nella documentazione in linea per SQL Server (http://msdn.microsoft.com/en-us/library/ms180954(v=sql.105).aspx). Sapendo quello che so su SQLOS, SQL Server e hardware, questo ha senso. Prima della limitazione di 20 processori logici in SQL Server 2012 Enterprise Edition con licenza Server+CAL, era raro che SQL Server avesse uno squilibrio dell'utilità di pianificazione tra i nodi NUMA in un server di produzione. Uno dei problemi in questo caso specifico è il modo in cui il NUMA virtuale è stato passato alla VM. L'esecuzione della stessa identica installazione sull'hardware fisico consente a tutti gli scheduler di essere ONLINE VISIBILI poiché i processori logici aggiuntivi presentati dagli hyperthread sono distinguibili da SQL e gratuiti.

In altre parole, il limite di 20 processori logici si traduce effettivamente in 40 scheduler ONLINE se (a) non è una macchina virtuale, (b) i processori sono Intel e (c) l'hyper-threading è abilitato.

Quindi vediamo questo messaggio nel registro degli errori:

Data    14/11/2012 22:36:18
Registro     SQL Server (attuale:14/11/2012 22:36:00)
Server di origine
Messaggio
SQL Il server ha rilevato 2 socket con 8 core per socket e 16 processori logici per socket, 32 processori logici totali; utilizzando 32 processori logici basati sulla licenza di SQL Server. Questo è un messaggio informativo; Non è richiesta alcuna azione da parte dell'utente.

E la stessa query di cui sopra fa sì che tutti i 32 processori siano VISIBILI ONLINE:

SELECT 
  parent_node_id,
  [status], 
  scheduler_id, 
  [cpu_id], 
  is_idle, 
  current_tasks_count, 
  runnable_tasks_count, 
  active_workers_count, 
  load_factor
FROM sys.dm_os_schedulers
WHERE [status] = N'VISIBLE ONLINE';


Figura 6 – Stessa configurazione sull'hardware fisico

In questo caso, poiché ci sono solo 32 processori logici, il limite di 20 (beh, 40) core non ha alcun impatto su di noi e il lavoro è distribuito uniformemente su tutti i core.

Negli scenari in cui la limitazione a 20 processori influisce sul saldo NUMA degli scheduler, è possibile modificare manualmente la configurazione del server per bilanciare il numero di scheduler VISIBILI ONLINE in ciascuno dei nodi NUMA tramite l'uso di ALTER SERVER CONFIGURATION . Nell'esempio di VM fornito, il comando seguente configurerà i primi 10 processori logici in ogni nodo NUMA su VISIBLE ONLINE.

ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 9, 16 TO 25;

Con questa nuova configurazione, che esegue lo stesso carico di lavoro di 300 sessioni e il carico di lavoro della documentazione in linea di AdventureWorks, possiamo vedere che lo squilibrio del carico non si verifica più.


Figura 7 – Saldo ripristinato con configurazione manuale

E ancora utilizzando SQL Sentry Performance Advisor possiamo vedere il carico della CPU distribuito in modo più uniforme su entrambi i nodi NUMA:


Figura 8 – Saldo NUMA come mostrato in SQL Sentry Performance Advisor

Questo problema non è strettamente limitato alle macchine virtuali e al modo in cui le CPU virtuali vengono presentate al sistema operativo. È anche possibile incorrere in questo problema con l'hardware fisico. Ad esempio, un vecchio Dell R910 con quattro socket e otto core per socket, o anche un server basato su AMD Opteron 6200 Interlagos con due socket e 16 core per socket, che si presenta come quattro nodi NUMA con otto core ciascuno. In una di queste configurazioni, lo squilibrio del processo può anche comportare che uno dei nodi NUMA venga impostato completamente offline. Di conseguenza, anche altri effetti collaterali, come la distribuzione della memoria di quel nodo tra i nodi online che causano problemi di accesso alla memoria esterna, possono peggiorare le prestazioni.

Riepilogo

La configurazione predefinita di SQL Server 2012 che utilizza la licenza Enterprise Edition per Server+CAL non è l'ideale in tutte le configurazioni NUMA che potrebbero esistere per SQL Server. Ogni volta che viene utilizzata la licenza Enterprise Server+CAL, è necessario rivedere la configurazione NUMA e gli stati dell'utilità di pianificazione per nodo NUMA per garantire che SQL Server sia configurato per prestazioni ottimali. Questo problema non si verifica con le licenze basate su core poiché tutti gli scheduler sono concessi in licenza e VISIBILI ONLINE.