La virtualizzazione è molto popolare per le organizzazioni:consente loro di utilizzare meglio l'hardware combinando più server su un singolo host, fornisce funzionalità HA e offre una riduzione di vari costi come riscaldamento/raffreddamento, licenze SQL Server e hardware. Sono stato coinvolto in numerosi progetti con le organizzazioni per aiutarle a migrare dagli ambienti fisici a quelli virtuali e le ho aiutate a sperimentare questi vantaggi.
Quello che voglio condividere con te in questo articolo è un problema particolare che ho riscontrato mentre lavoravo con Hyper-V su Windows Server 2012 R2 utilizzando la memoria dinamica. Devo ammettere che la maggior parte della mia conoscenza della virtualizzazione è stata con VMware, tuttavia ora le cose stanno cambiando.
Quando lavoro con SQL Server su VMware, consiglio sempre di impostare le prenotazioni per la memoria, quindi quando ho riscontrato questa funzionalità di memoria dinamica con Hyper-V ho dovuto fare alcune ricerche. Ho trovato un articolo (Guida alla configurazione della memoria dinamica Hyper-V) che spiega molti dei vantaggi e dei requisiti di sistema per l'utilizzo della memoria dinamica. Questa funzionalità è piuttosto interessante nel modo in cui puoi fornire una macchina virtuale con più o meno memoria senza che sia necessario spegnerla.
Giocando con Hyper-V ho scoperto che il provisioning di macchine virtuali è semplice e facile da imparare. Con poco sforzo sono stato in grado di creare un ambiente di laboratorio per simulare l'esperienza che stava vivendo il mio cliente. Il merito va al mio capo per avermi fornito hardware eccezionale con cui lavorare. Sto utilizzando un Dell M6800 con un processore i7, 32 GB di RAM e due SSD da 1 TB. Questa bestia è migliore di molti server su cui ho lavorato.
Utilizzando VMware Workstation 11 sul mio laptop, ho creato un guest Windows Server 2012 R2 con 4 vCPU, 24 GB di RAM e 100 GB di spazio di archiviazione. Dopo aver creato e corretto il guest, ho aggiunto il ruolo Hyper-V e ho eseguito il provisioning di un guest in Hyper-V. Il nuovo guest è stato creato con Windows Server 2012 R2 con 2 vCPU, 22 GB di RAM e 60 GB di storage con SQL Server 2014 RTM.
Ho eseguito tre serie di test, ciascuno utilizzando la memoria dinamica. Per ogni test ho utilizzato SQL Data Generator di Red Gate contro il database AdventureWorks2014 per riempire il pool di buffer. Per il primo test ho iniziato con 512 MB per il valore della RAM di avvio poiché questa è la quantità minima di memoria per avviare Windows Server 2012 R2 e il pool di buffer ha smesso di aumentare a circa 8 GB.
Per ogni test troncherei la mia tabella di test, spegnerò il guest, modificherei le impostazioni di memoria e avvierò il backup del guest. Per il secondo test ho aumentato la RAM di avvio a 768 MB e il pool di buffer è aumentato solo a poco più di 12 GB.
Per il terzo e ultimo test è stata aumentata la RAM di avvio a 1024 MB, eseguito il generatore di dati e il pool di buffer è stato in grado di aumentare fino a poco meno di 16 GB.
Fare un po' di calcoli su questi valori mostra che il pool di buffer non può crescere più di 16 volte la RAM di avvio. Questo può essere molto problematico per SQL Server se la RAM di avvio è inferiore a 1/16 della dimensione della memoria massima. Pensiamo a un guest Hyper-V con 64 GB di RAM che esegue SQL Server con un valore di RAM di avvio di 1 GB. Abbiamo osservato che il pool di buffer non sarebbe in grado di utilizzare più di 16 GB con questa configurazione, ma se impostiamo il valore della RAM di avvio su 4096 MB, il pool di buffer potrebbe aumentare di 16 volte consentendoci di utilizzare tutti i 64 GB.
Gli unici riferimenti che sono riuscito a trovare sul motivo per cui il pool di buffer è limitato a 16 volte il valore della RAM di avvio erano nelle pagine 8 e 16 del white paper, Best Practices for Running SQL Server with HVDM. Questo documento spiega che poiché il valore della cache del buffer viene calcolato all'avvio, è un valore statico e non cresce. Tuttavia, se SQL Server rileva che la memoria di aggiunta a caldo è supportata, aumenta la dimensione riservata per lo spazio degli indirizzi virtuali per il pool di buffer di 16 volte la memoria di avvio. Questo documento afferma inoltre che questo comportamento influisce su SQL Server 2008 R2 e versioni precedenti, tuttavia il mio test è stato condotto su Windows Server 2012 R2 con SQL Server 2014, quindi contatterò Microsoft per ottenere l'aggiornamento del documento sulle migliori pratiche.
Poiché la maggior parte dei DBA di produzione non esegue il provisioning di macchine virtuali o lavora pesantemente in quello spazio e gli ingegneri della virtualizzazione non stanno studiando la più recente e migliore tecnologia di SQL Server, posso capire come queste importanti informazioni su come il pool di buffer gestisce la memoria dinamica siano sconosciute a molti delle persone.
Anche seguire gli articoli può essere fuorviante. Nell'articolo Guida alla configurazione della memoria dinamica Hyper-V, la descrizione della RAM di avvio recita:
Specifica la quantità di memoria richiesta per avviare la macchina virtuale. Il valore deve essere sufficientemente alto da consentire l'avvio del sistema operativo guest, ma deve essere il più basso possibile per consentire un utilizzo ottimale della memoria e rapporti di consolidamento potenzialmente elevati.Utilizzo ottimale della memoria per chi, l'host o l'ospite? Se un amministratore di virtualizzazione stesse leggendo questo, probabilmente determinerebbe che significa la memoria minima consentita per avviare il sistema operativo.
Essere responsabili di SQL Server significa che dobbiamo conoscere altre tecnologie che possono influenzare il nostro ambiente. Con l'introduzione delle SAN e della virtualizzazione, dobbiamo comprendere appieno come le cose in quegli ambienti possono avere un impatto negativo su SQL Server e, cosa più importante, come comunicare efficacemente le preoccupazioni alle persone responsabili di tali sistemi. Un DBA non deve necessariamente sapere come eseguire il provisioning dello storage in una SAN o come eseguire il provisioning o essere in grado di amministrare un ambiente VMWare o Hyper-V, ma dovrebbe conoscere le basi di come funzionano le cose.
Conoscendo le nozioni di base su come funziona una SAN con array di archiviazione, reti di archiviazione, percorsi multipli e così via, nonché su come funziona l'hypervisor con la pianificazione delle CPU e l'allocazione dello storage all'interno della virtualizzazione, un DBA può comunicare meglio e risolvere i problemi quando si verificano problemi . Nel corso degli anni ho lavorato con successo con numerosi amministratori di SAN e di virtualizzazione per creare standard per SQL Server. Questi standard sono univoci per SQL Server e non si applicano necessariamente a server Web o applicazioni.
I DBA non possono davvero fare affidamento sulla SAN e sugli amministratori della virtualizzazione per comprendere appieno le best practice per SQL Server, indipendentemente da quanto sarebbe bello, quindi dobbiamo istruirci al meglio su come le loro aree di competenza possono influire su di noi.
Durante i miei test ho utilizzato una query dal post sul blog di Paul Randal, Problemi di prestazioni dalla memoria del pool di buffer sprecata, per determinare la quantità di pool di buffer utilizzata dal database AdventureWorks2014. Ho incluso il codice qui sotto:
SELECT (CASE WHEN ([database_id] = 32767) THEN N'Resource Database' ELSE DB_NAME ([database_id]) END) AS [DatabaseName], COUNT (*) * 8 / 1024 AS [MBUsed], SUM (CAST ([free_space_in_bytes] AS BIGINT)) / (1024 * 1024) AS [MBEmpty] FROM sys.dm_os_buffer_descriptors GROUP BY [database_id];
Questo codice è ottimo anche per la risoluzione dei problemi di quale dei tuoi database sta consumando la maggior parte del tuo pool di buffer, così puoi sapere su quale database dovresti concentrarti sull'ottimizzazione delle query ad alto costo. Se sei un negozio Hyper-V, verifica con il tuo amministratore se la memoria dinamica può essere configurata in modo tale da avere un impatto negativo sul tuo server.