Ha senso avere più di 64 CPU per SQL Server 2008 ?

E’ una domanda, assolutamente non provocatoria, che ho ricevuto di recente da alcuni Clienti preoccupati dall’impossibilità di sfruttare a pieno il non trascurabile investimento in un hardware di ultima generazione, magari server dotati delle recenti CPU “Westmere” di Intel con ben 10 Core per CPU. Ovviamente, nel contesto di questo articolo faremo implicito riferimento alle sole architetture “x64”, considerando anche i processori forniti da AMD, oltre che a quelli di INTEL.

Accanto a questa domanda, eccone un'altra che da un po’ di anni non sentivo, e cioè: “E’ consigliato disabilitare l’Hyper Threading ?” Nonostante esistano moltissimi articoli e altro materiale su Internet che dibattono sull’argomento, un punto fermo non esiste e la prima banale risposta a questa seconda domanda è la più odiosa che spesso mi sento rivolgere da inglesi e americani: “It depends ! ” J . Prometto che in prossimo “post” cercherò di chiarire questo famoso punto certo.

In questo caso la domanda è più pertinente del solito perché nel caso di un server con 4 CPU, ognuna con 10 CORE e dotate di Hyper Threading, il numero di CPU “logiche” disponibili per SQL Server (e Windows) arrivano ad un totale di (4 x 10 x 2) = 80 !

L’idea, non completamente corretta, del mio Cliente era di disabilitare l’Hyper Threading per abbassare il numero di CPU “logiche” da 80 a 40 in modo da rientrare nel limite delle 64 CPU logiche tanto, come è convinzione diffusa, (1) più di 64 non sono sono gestite e (2) l’Hyper Threading non dà alcun vantaggio in SQL Server.

Per quanto riguarda il primo punto relativo all’ Hyper Threading, mi spiace ma dovrete aspettare un successivo post, qui mi limito a riportare due semplici considerazioni basata su un discreto numero di anni di esperienza sul campo in questo settore:

  1. Negli ultimi 10 anni l’unica raccomandazione, sia da Intel che da Microsoft, che espressamente raccomandava di disabilitare l’ Hyper Threading era relativa a Windows Server 2000, ed ovviamente al tipo di CPU in circolazione a quel tempo: il motivo è semplice, l’arrivo dell’ Hyper Threading fu successivo al rilascio di Windows Server 2000 per cui Microsoft non fece in tempo ad incorporare la necessaria logica all’interno di questo Sistema Operativo;
  2.  Ad accezzione del caso precedente, non esiste alcuna raccomandazione ufficiale in tal senso, la confusione che regna su Internet in relazione all’argomento è che ogni persona che ha scritto qualcosa sull’argomento ha condotto i propri test su un “workload” specifico di SQL Server, per cui qualcuno ha trovato benefico mantenere l’ Hyper Threading abilitato, altri no;

 

Ora veniamo al punto principale della questione e quindi al soggetto di questo articolo, e cioè il discorso relativo al numero massimo di CPU/CORE: SQL Server 2008 supporta più di 64 CPU “logiche” ? In che condizioni ? Su quali versioni ?

  • In effetti questo è vero per “SQL Server 2008” ma non per “SQL Server 2008 R2” dove il limite, sia nella versione Enterprise che Datacenter, è di 256 CPU “logiche” (termine un po’ ambiguo, lo so). Il mio cliente, nel caso specifico, utilizza proprio questa versione di SQL Server;
  •  Come probabilmente alcuni di voi sapranno, la versione “R2” di SQL Server 2008 è effettivamente una “repacchettizzazione” per aggiungere a questa famiglia di prodotti alcune componenti aggiuntive legate alla “Business Intelligence” come Power Pivot e “Stream Insight” (CEP = Complex Event Processing) ed altre “features” come “Master Data Services” (MDS). Da un punto di vista del database engine, però, ci sono comunque state delle piccole ma significanti modifiche ed il supporto fino a 256 CPU “logiche” è una di queste; per una panoramica dettagliata delle differenze, potete consultare la seguente pagina internet:http://www.microsoft.com/sqlserver/en/us/product-info/compare.aspx
  •  Attenzione alla versione di Windows Server utilizzata perché in realtà, nelle specifiche di SQL Server 2008 R1/R2 riportate nel link sopra menzionato, non è scritto esplicitamente che sono supportate 256 CPU logiche, bensì “OS Maximum”:
  •  Questo vuol dire che, anche se state utilizzando SQL Server 2008 R2 che le supporta, se non utilizzate la giusta versione di Windows Server non avrete quello che state cercando perché il Sistema Operativo impone un limite più restrittivo a SQL Server.
  •  Ovviamente, la versione “giusta” di Windows Server da utilizzare è “Windows Server 2008 R2 Enterprise Edition” (o Datacenter), come non potete facilmente verificare nella seguente tabella dove, ahimè, si continua a parlare di “socket” e non di CORE, ancora meno di CPU “logiche”: Edition Comparison by Technical Specification http://www.microsoft.com/windowsserver2008/en/us/r2-compare-specs.aspx 



NOTA per l’autore: ricordare a Microsoft di riportare in queste tabelle anche l’informazione relativa ai CORE e alle CPU “logiche” onde evitare ulteriore confusione da parte dei Clienti;

 

Quindi, ricapitolando, con Windows Server 2008 R2 e SQL Server 2008 R2 è possibile arrivare a sfruttare a pieno fino ad un totale di 256 CPU “logiche”, inteso come numero ottenuto moltiplicando il numero di “SOCKET” al numero di “CORE” per ogni “SOCKET”, infine moltiplicando il tutto per due in caso di Hyper Threading, ad esempio:

  •  4 “SOCKET” (CPU) x 8 “CORE” con HT = 64 “logical CPU” à E’ sufficiente utilizzare “SQL Server 2008”, “Standard Edition” o superiore, su “Windows Server 2008 R2”, “Standard Edition” o superiore;
  •  6 “SOCKET” (CPU) x 8 “CORE” senza HT = 48 “logical CPU” à E’ necessario utilizzare come minimo la versione “Enterprise” di Windows Server 2008 R2 perché la “Standard” supporta un massimo di 4 “SOCKET” (CPU) e come minimo la versione “Enterprise” di “SQL Server 2008 R2” per lo stesso tipo di limitazione sul numero di “SOCKET”;
  •  8 “SOCKET” (CPU) x 10 “CORE” con HT = 160 “logical CPU” à E’ necessario utilizzare almeno la versione “Enterprise” di “Windows Server 2008 R2” unitamente alla versione “Enterprise” di SQL Server 2008 R2”;
  •  16 “SOCKET” (CPU) x 10 “CORE” con HT = 320 “logical CPU” à E’ necessario/consigliato disabilitare l’HT per rientrare nel limite delle 256 “logical CPU” imposto in primo luogo dal Sistema Operativo “Windows Server 2008 R2” (sia “Enterprise” che “Data Center”;

IMPORTANTE: In particolare riferimento all’ultima ipotesi numerica sopra riportata, e considerato l’annuncio sia da parte di INTEL che di AMD di nuove CPU con ancora maggiori numeri di “CORE”, è altamente probabile, ma non sicuro/ufficiale, che il numero massimo di CPU “logiche” attualmente supportato sia innalzato prima dell’uscita della prossima versione “Server” di “Windows”, presumibilmente con il rilascio di una nuova “Service Pack”.

Ci sono alcune considerazioni aggiuntive che, in questi scenari da più di 64 CPU “logiche”, devono essere fatte:

  •  ATTENZIONE: Solo il “database engine” di SQL Server può utilizzare più di 64 CPU “logiche”, le altre componenti della famiglia di prodotti SQL Server (Analysis Services, Integration Services, Reporting Services, etc.) non possono sfruttare questa possibilità:http://msdn.microsoft.com/en-us/library/ee210547(SQL.105).aspx
  •  ATTENZIONE: In caso SQL Server 2008 (e successivi) utilizzino più di 64 CPU “logiche”, non è supportato (e non funziona !) utilizzare il meccanismo dell’ “Affinity Mask”;
  •  E’ consigliato avere bene in mente il significato dell’acronimo “NUMA” in quanto tutte queste potenti macchine sono basate, più o meno, su questa architettura e “SQL Server 2005” (e successive versioni) contengono delle importanti ottimizzazioni in merito:

 

Process name

Use more than 64 CPUs

SQL Server Database Engine

Yes

Reporting Services

No

Analysis Services

No

Integration Services

No

Service Broker

No

Full-Text Search

No

SQL Server Agent

No

SQL Server Management Studio

No

SQL Server Setup

No

 

In un prossimo post proverò ad addentrarmi nei meccanismi di SQL Server che riguardano le architetture NUMA, il famigerato parametro MAXDOP, le relative ottimizzazioni ed ai problemi che ne possono scaturire.

 

Buon lavoro a tutti.

-Igor Pagliai-