Espansione e riduzione del pool di buffer in configurazione NUMA
In questo argomento viene descritto come assegnare pagine di memoria del pool di buffer quando si utilizza la configurazione NUMA (Non-Uniform Memory Access). Le informazioni contenute in questo argomento consentono di comprendere in che modo SQL Server utilizza la configurazione NUMA e come interpretare i contatori dell'oggetto Buffer Node.
Distribuzione della memoria
Per ogni nodo NUMA fisico esiste un nodo di memoria di SQL Server. I nodi di memoria crescono indipendentemente l'uno dall'altro, ma la memoria viene suddivisa in modo uniforme. Per illustrare la differenza di distribuzione fra la memoria locale e la memoria esterna in SQL Server, in questo argomento viene utilizzato un esempio che presuppone che il computer disponga di 16 gigabyte (GB) di memoria. Parte della memoria di ogni nodo è stata utilizzata da altre applicazioni, fra cui Windows, SQL Server ha assegnato una certa quantità di memoria ai processi esterni al pool di buffer e SQL Server dispone di 10 GB di memoria da assegnare al pool di buffer. La memoria del pool di buffer è suddivisa in quattro nodi NUMA fisici, N0, N1, N2 e N3, ognuno dei quali ha a disposizione la memoria locale seguente:
N0 – 1 GB
N1 – 3 GB
N2 – 3 GB
N3 – 3 GB
Nella configurazione precedente, tutti i nodi finiranno con l'allocare e utilizzare 2,5 GB di memoria. Il nodo N0, tuttavia, disporrà al termine di 1 GB della propria memoria e di 1,5 GB di memoria di altri nodi.
Assegnazione della memoria all'avvio
Quando si utilizza NUMA, SQL Server riceve memoria dal sistema operativo con una frequenza simile a un sistema non NUMA, anche se la memoria libera iniziale non viene distribuita fra i nodi in modo uniforme. Il pool di buffer tenta di ottenere la massima memoria locale possibile per ogni nodo, tuttavia questa operazione è complessa, in quanto Windows non dispone attualmente di una API per l'allocazione della memoria di un nodo specifico.
Quando la memoria viene assegnata a SQL Server, alcuni nodi ricevono molte pagine da altri nodi NUMA, denominate pagine esterne. Queste pagine non vengono tuttavia utilizzate durante il processo di avvio, poiché vengono frequentemente trasferite al nodo proprietario e diventano pagine locali di tale nodo. Quando viene raggiunto il valore di max server memory, è possibile che alcuni nodi dispongano di memoria esterna. Una volta raggiunta la memoria massima, tuttavia, il pool di buffer gestirà la memoria locale e la memoria esterna in modo identico. Ad esempio, in condizioni di scarsa disponibilità di memoria, il pool di buffer non farà alcun tentativo per liberare pagine di memoria esterne prima delle pagine di memoria locali.
Limitazione della memoria a nodi specifici
Se SQL Server è stato configurato per l'esecuzione su un subset dei nodi NUMA disponibili, il pool di buffer non sarà limitato automaticamente all'utilizzo della memoria di tali nodi. In questo caso, utilizzare l'opzione max server memory per limitare le dimensioni del pool di buffer. Per informazioni su max server memory, vedere Opzioni per la memoria server.
Rilascio di memoria da un nodo
Quando si utilizza NUMA; i valori max server memory e min server memory vengono suddivisi in modo uniforme fra i nodi NUMA. Ad esempio, se l'opzione max server memory è impostata su 16 GB in un sistema con quattro nodi, il pool di buffer allocherà 4 GB di memoria a ogni nodo . Se si porta uno dei nodi in modalità non in linea modificando l'impostazione affinity mask, il valore di max server memory verrà ridistribuito fra i nodi rimanenti. Nell'esempio precedente a quattro nodi, se due nodi vengono portati in modalità in linea, gli otto GB di memoria rilasciati verranno distribuiti uniformemente fra i nodi rimanenti. Poiché il pool di buffer è in grado di utilizzare pagine esterne, se nei nodi rimanenti non è disponibile memoria sufficiente, verrà utilizzata la memoria remota. Se si desidera che SQL Server non utilizzi memoria dei nodi sui quali non è più in esecuzione, dopo aver portato i nodi in modalità non in linea è necessario ridurre il valore di max server memory.
Pagine esterne
I nodi funzionano per lo più in modo indipendente l'uno dall'altro. Tutte le allocazioni e le deallocazioni di memoria per un nodo vengono eseguite utilizzando la memoria associata al nodo. Se tuttavia un thread di lavoro in esecuzione nel nodo N1 deve accedere a una pagina di database già disponibile nella memoria del nodo N2, accederà alla memoria non locale.
Analisi della memoria locale e della memoria esterna nel pool di buffer
Il pool di buffer può essere analizzato visualizzando l'oggetto Buffer Node. La memoria totale nel pool di buffer per SQL Server viene visualizzata nel contatore Obiettivo numero di pagine dell'oggetto Buffer Manager. La memoria per ogni nodo nel pool di buffer viene visualizzata nel contatore Obiettivo numero di pagine dell'oggetto Buffer Node. La memoria di altri nodi viene visualizzata nel contatore Pagine esterne. Per ulteriori informazioni, vedere Oggetto Buffer Node di SQL Server e Oggetto Buffer Manager di SQL Server.
Creazione di checkpoint nella memoria dei singoli nodi
Ogni nodo di memoria dispone di un proprio thread Lazywriter, che viene chiamato sia per i checkpoint impliciti che per i checkpoint espliciti. Poiché un computer SMP (multiprocessori simmetrici, Symmetric Multiprocessor) dispone di un unico thread di gestione dei checkpoint, quando si utilizza NUMA i thread multipli provocano un aumento della velocità del checkpoint.
Funzionamento di Table Scan
Una scansione di tabella in esecuzione nel nodo N1 utilizzerà solo la memoria associata al nodo N1, a meno che la scansione non venga eseguita in parallelo sulle CPU di più nodi. Se la scansione viene eseguita in un solo nodo, verranno utilizzate solo le pagine buffer di tale nodo. In questo modo è possibile partizionare il carico di lavoro di un'applicazione.