Configurazione del server: maschera di affinità
Si applica a: SQL Server
Nota
Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata. Usare invece ALTER SERVER CONFIGURATION.
Per eseguire il multitasking, Windows sposta talvolta thread tra processori diversi. Anche se in questo modo viene garantita una maggiore efficienza del sistema operativo, questa attività può comportare una riduzione delle prestazioni di SQL Server nel caso di carichi di lavoro elevati, poiché la cache di ogni processore viene ricaricata più volte con dati. In tali condizioni, l'assegnazione dei processori a specifici thread può aumentare le prestazioni eliminando il ricaricamento dei processori. Questa associazione tra un thread e un processore è definita affinità processori.
SQL Server supporta l'affinità dei processori tramite due opzioni di maschera di affinità: affinity mask
(nota anche come maschera di affinità della CPU) e affinity I/O mask
. Per altre informazioni su affinity I/O mask option
, vedere Configurare l’opzione di configurazione del server affinity I/O mask. Il supporto di Affinity CPU e I/O per server con 33 fino a 64 processori richiede rispettivamente l'uso aggiuntivo dell'opzione di configurazione del server affinity64.mask e affinity64 I/O mask.
Nota
Il supporto dell'affinità nei server dotati di un numero di processori compreso tra 33 e 64 è disponibile solo su sistemi operativi a 64 bit.
L'opzione affinity mask
, già disponibile nelle versioni precedenti di SQL Server, controlla in modo dinamico l'affinità della CPU.
In SQL Server è possibile configurare l'opzione affinity mask
senza che sia necessario riavviare l'istanza di SQL Server. Quando si usa sp_configure,
è necessario eseguire RECONFIGURE
o RECONFIGURE WITH OVERRIDE
dopo l'impostazione di un'opzione di configurazione. Se si usa SQL Server Express, la modifica dell'opzione affinity mask
richiede il riavvio.
Le modifiche alle maschere di affinità vengono eseguite in modo dinamico, consentendo l'avvio e l'arresto su richiesta delle utilità di pianificazione della CPU che associano i thread dei processi all'interno di SQL Server. Questa situazione si può verificare quando le condizioni nel server vengono modificate. Ad esempio, se nel server viene aggiunta una nuova istanza di SQL Server, potrebbe essere necessario modificare l'opzione affinity mask
per ridistribuire il carico dei processori.
Per le modifiche alle maschere di bit di affinità, è necessario che SQL Server abiliti una nuova utilità di pianificazione della CPU e disabiliti quella esistente. È quindi possibile elaborare nuovi batch nelle nuove utilità di pianificazione o in quelle rimanenti.
Per avviare una nuova utilità di pianificazione della CPU, SQL Server crea una nuova utilità di pianificazione e la aggiunge all'elenco di quelle standard. La nuova utilità di pianificazione viene presa in considerazione unicamente per i nuovi batch in entrata. L'esecuzione dei batch correnti continua nella stessa utilità di pianificazione. I thread di lavoro migrano alla nuova utilità di pianificazione man mano che si liberano o che ne vengono creati di nuovi.
Per chiudere un'utilità di pianificazione, è necessario che tutti i batch nell'utilità abbiano completato le relative attività e interrompano l'esecuzione. Un pianificatore che è stato chiuso viene contrassegnato come offline, in modo che non venga pianificato alcun nuovo batch su di essa.
Se viene aggiunta o rimossa una nuova utilità di pianificazione, le attività di sistema permanenti quali monitoraggio dei blocchi, checkpoint, i thread delle attività di sistema (DTC di elaborazione) e il processo di segnalazione proseguono l'esecuzione mentre il server è operativo. Queste attività di sistema permanenti non eseguono la migrazione in modo dinamico. Per ridistribuire il carico del processore per queste attività tra le utilità di pianificazione, è necessario riavviare l'istanza di SQL Server. Se SQL Server tenta di chiudere un'utilità di pianificazione associata a un'attività di sistema permanente, l'esecuzione dell'attività continua nell'utilità di pianificazione offline (nessuna migrazione). L'utilità di pianificazione è associata ai processori nella maschera di affinità modificata e non dovrebbe applicare alcun carico al processore al quale è stata associata prima della modifica. La presenza di utilità di pianificazione offline aggiuntive non dovrebbe influire in modo significativo sul carico del sistema. In tal caso, è necessario riavviare il server di database per riconfigurare queste attività nelle utilità di pianificazione disponibili con la maschera di affinità modificata.
Non impostare i valori di configurazione affinity mask
e affinity I/O mask
di SQL Server per usare le stesse CPU. Le prestazioni possono risentirne se si sceglie di associare un processore sia per la pianificazione dei thread di lavoro sia per l'elaborazione di I/O di SQL Server. Assicurarsi pertanto che i valori di configurazione non siano impostati per lo stesso processore. La stessa raccomandazione si applica a affinity64 mask
e affinity64 I/O mask
. Per garantire che la nuova affinity mask
non si sovrapponga a affinity I/O mask
, il comando RECONFIGURE verifica che le normali affinità di CPU e I/O si escludano a vicenda. In caso contrario, nella sessione del client e nel log degli errori di SQL Server viene visualizzato un messaggio di errore che indica che l'impostazione non è consigliata.
Msg 5834, Level 16, State 1, Line 1
The affinity mask specified conflicts with the IO affinity mask specified. Use the override option to force this configuration.
Per consentire affinità di CPU e di I/O che si sovrappongono e non si escludono a vicenda, è possibile eseguire le opzioni RECONFIGURE WITH OVERRIDE
.
La affinity I/O mask
influisce direttamente sui processi di affinità di I/O, ad esempio i processi Lazywriter e i thread per la scrittura nel log. Se i processi Lazywriter e i thread per la scrittura nel log non sono associati, essi seguono le stesse regole definite per le attività permanenti, ad esempio monitoraggio dei blocchi o checkpoint.
Se si specifica una maschera di affinità che tenta di eseguire il mapping a una CPU non esistente, il comando RECONFIGURE
visualizza un messaggio di errore nella sessione client e nel log degli errori di SQL Server. In questo caso, l'utilizzo dell'opzione RECONFIGURE WITH OVERRIDE
non avrà alcun effetto e verrà visualizzato di nuovo lo stesso errore di configurazione.
È anche possibile escludere l'attività di SQL Server da assegnazioni di carichi di lavoro specifici del sistema operativo Windows. Se si imposta su 1 un bit corrispondente a un processore su 1
, il processore viene selezionato dal motore di database di SQL Server per l'assegnazione di thread. Se si imposta affinity mask
su 0
(impostazione predefinita), l'affinità del thread viene impostata dagli algoritmi di pianificazione di Microsoft Windows. Se l'opzione affinity mask
viene impostata su un valore diverso da zero, l'affinità di SQL Server interpreta il valore come maschera di bit indicante i processori selezionabili.
L'esclusione dei thread di SQL Server da processori specifici consente a Microsoft Windows di valutare adeguatamente la gestione dei processi specifici di Windows. Ad esempio, per un server con 8 CPU nel quale sono in esecuzione due istanze di SQL Server (istanza A e B), l'amministratore di sistema può usare l'opzione affinity mask
per assegnare il primo set di 4 CPU all'istanza A e il secondo set di 4 CPU all'istanza B. Per configurare più di 32 processori, impostare entrambe le opzioni affinity mask
e affinity64 mask
. I valori per l'opzione affinity mask
sono i seguenti:
Byte in maschera | Numero di CPU |
---|---|
1 byte | Fino a 8 CPU |
2 byte | Fino a 16 CPU |
3 byte | Fino a 24 CPU |
4 byte | Fino a 32 CPU |
Per coprire più di 32 CPU, configurare un affinity mask
da 4 byte per le prime 32 CPU e un affinity64 mask
da 4 byte per le CPU rimanenti.
L'impostazione dell'affinità processori di SQL Server è un'operazione estremamente complessa; usarla unicamente se è necessario. Nella maggior parte dei casi, l'affinità predefinita di Windows offre le migliori prestazioni. Quando si impostano le maschere di affinità, tenere in considerazione i requisiti delle CPU delle altre applicazioni. Per ulteriori informazioni, consultare la documentazione di Windows.
Nota
Per visualizzare e analizzare l'utilizzo dei singoli processori, è possibile utilizzare Monitoraggio processi.
Quando si specifica l'opzione affinity I/O mask
è necessario usarla insieme all'opzione di configurazione affinity mask
. Come già accennato in precedenza, non abilitare la stessa CPU sia nello switch affinity mask
che nell'opzione affinity I/O mask
. Lo stato dei bit corrispondenti a ogni CPU deve essere uno dei tre seguenti:
affinity I/O mask
sia nell'opzioneaffinity mask
che nell'opzione0
.1
sia nell'opzioneaffinity mask
che nell'opzione0
eaffinity I/O mask
.0
sia nell'opzioneaffinity mask
che nell'opzione1
eaffinity I/O mask
.
Attenzione
Non configurare l'affinità della CPU nel sistema operativo Windows e configurare l'opzione affinity mask
in SQL Server. Le due impostazioni mirano a ottenere lo stesso risultato e, se le configurazioni sono incoerenti, potrebbero causare risultati imprevisti. La configurazione ottimale dell'affinità della CPU di SQL Server può essere ottenuta usando l'opzione sp_configure
in SQL Server.
Esempi
Si supponga di configurare l'opzione affinity mask
. Se, ad esempio, i processori 1, 2 e 5 sono selezionati come disponibili tramite l'impostazione dei bit 1, 2 e 5 su 1
e l'impostazione dei bit 0, 3, 4, 6 e 7 su 0
, deve essere usato il valore esadecimale 0x26
oppure l'equivalente decimale di 38
. Numerare le posizioni dei bit da destra a sinistra.
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
EXEC sp_configure 'affinity mask', 38;
RECONFIGURE;
GO
La tabella seguente mostra i valori affinity mask
per un sistema a 8 CPU.
Valore decimale | Maschera di bit binaria | Numeri dei processori in cui vengono eseguiti i thread di SQL Server |
---|---|---|
1 |
00000001 |
0 |
3 |
00000011 |
0 e 1 |
7 |
00000111 |
0, 1 e 2 |
15 |
00001111 |
0, 1, 2 e 3 |
31 |
00011111 |
0, 1, 2, 3 e 4 |
63 |
00111111 |
0, 1, 2, 3, 4 e 5 |
127 |
01111111 |
0, 1, 2, 3, 4, 5 e 6 |
255 |
11111111 |
0, 1, 2, 3, 4, 5, 6 e 7 |
L’opzione affinity mask
è un'opzione avanzata. Se per modificare l'impostazione si usa la stored procedure di sistema sp_configure
, sarà possibile modificare affinity mask
solo quando il valore di show advanced options
è impostato su 1
. Dopo aver eseguito il comando Transact-SQL RECONFIGURE
, la nuova impostazione viene applicata immediatamente senza che sia necessario riavviare l'istanza di SQL Server.
NUMA (Non-Uniform Memory Access)
Quando si usa hardware basato sulla configurazione accesso non uniforme alla memoria (NUMA) ed è impostata l'opzione affinity mask
, tutte le utilità di pianificazione di un nodo verranno associate alla rispettiva CPU. Quando l'opzione affinity mask
non è impostata, ogni utilità di pianificazione viene associata al gruppo di CPU contenute nel nodo NUMA. Un'utilità di pianificazione di cui viene eseguito il mapping al nodo NUMA N1
potrà pianificare operazioni in qualsiasi CPU del nodo, ma non nelle CPU associate a un altro nodo.
Le operazioni eseguite in un solo nodo NUMA possono utilizzare solo pagine del buffer di tale nodo. Quando un'operazione viene eseguita in parallelo sulle CPU di più nodi, è possibile utilizzare la memoria di tutti i nodi coinvolti.
Problemi relativi alla licenza
L'affinità dinamica è strettamente correlata alle licenze per le CPU. SQL Server non consente di configurare le opzioni affinity mask
in modo da violare i criteri di licenza.
Startup
Se un'opzione maschera di affinità specificata viola i criteri di licenza durante l'avvio di SQL Server o durante il collegamento di database, il livello del motore completerà il processo di avvio o l'operazione di collegamento o ripristino del database e successivamente reimposterà il valore di esecuzione di sp_configure
per l'opzione affinity mask su zero, visualizzando un messaggio di errore nel log degli errori di SQL Server.
Riconfigurare
Se un'opzione affinity mask specificata viola i criteri di licenza durante l'esecuzione del comando Transact-SQL RECONFIGURE
, nella sessione client e nel log degli errori di SQL Server verrà visualizzato un messaggio di errore che richiede all'amministratore di database di riconfigurare l'opzione. In questo caso non viene accettato alcun comando RECONFIGURE WITH OVERRIDE
.