Proprietà dei pool di thread
In Analysis Services viene utilizzato il multithreading per molte operazioni, migliorando le prestazioni complessive del server mediante l'esecuzione di più processi in parallelo. Per gestire i thread in modo più efficiente, in Analysis Services vengono utilizzati pool di thread per preallocare thread e facilitarne la disponibilità per il processo seguente.
Ogni istanza di Analysis Services mantiene il proprio set di pool di thread. Esistono differenze significative nella modalità di utilizzo dei pool di thread da parte delle istanze tabulari e multidimensionali. La differenza più importante consiste nel fatto che solo le soluzioni multidimensionali utilizzano il pool di thread IOProcess. Di conseguenza, la proprietà PerNumaNode, descritta in questo argomento, non è significativa per le istanze tabulari.
In questo argomento sono incluse le sezioni seguenti:
Thread Management in Analysis Services
Thread Pool Property Reference
Set GroupAffinity to affinitize IO threads to logical processors in a processor group
Set PerNumaNode to create multiple IOProcess thread pools affinitized to a NUMA node
Determine current thread pool settings
Dependent or Related Properties
About MSMDSRV.INI
[!NOTA]
La distribuzione tabulare nei sistemi NUMA non rientra nell'ambito di questo argomento. Sebbene le soluzioni tabulari possano essere distribuire correttamente nei sistemi NUMA, è possibile che le caratteristiche relative alle prestazioni della tecnologia di database in memoria utilizzata dai modelli tabulari forniscano vantaggi limitati per le architetture a elevata scalabilità verticale. Per altre informazioni, vedere Case Study di Analysis Services: Utilizzo di modelli tabulari in soluzioni commerciali su larga scala e Requisiti hardware per una soluzione tabulare.
Gestione di thread in Analysis Services
In Analysis Services viene utilizzato il multithreading per sfruttare le risorse della CPU disponibili mediante l'aumento del numero di attività eseguite in parallelo. Il motore di archiviazione è di tipo multithreading. Esempi di processi multithreading eseguiti nel motore di archiviazione includono l'elaborazione di oggetti in parallelo o la gestione di query discrete propagate al motore di archiviazione oppure la restituzione di valori di dati richiesti da una query. Il motore delle formule, a causa della natura seriale dei calcoli valutati, è a thread singolo. Ogni query viene eseguita principalmente su un thread singolo, richiedendo e spesso rimanendo in attesa dei dati restituiti dal motore di archiviazione. I thread di query presentano un'esecuzione più lunga e vengono rilasciati solo dopo il completamento dell'intera query.
Per impostazione predefinita, nelle versioni di SQL Server 2012 e successive, per Analysis Services vengono utilizzati tutti i processori logici disponibili, fino a 640 nei sistemi che eseguono edizioni successive di Windows e SQL Server. All'avvio, il processo del file verrà assegnato a un gruppo di processori specifico, ma è possibile che nel tempo i thread vengano pianificati in un processore logico qualsiasi e in qualsiasi gruppo di processori.
Un effetto collaterale dell'utilizzo di un numero elevato di processori consiste nel fatto che a volte si può verificare una riduzione del livello delle prestazioni, poiché i carichi di elaborazione e query sono distribuiti tra un numero elevato di processori, con il conseguente aumento della contesa per le strutture di dati condivise. Questa situazione può verificarsi in particolare nei sistemi di fascia alta che utilizzano l'architettura NUMA, ma anche nei sistemi non NUMA che eseguono più applicazioni caratterizzate da un utilizzo elevato di dati nello stesso hardware.
Per risolvere questo problema, è possibile impostare l'affinità tra tipi di operazioni di Analysis Services e un set specifico di processori logici. La proprietà GroupAffinity consente di creare maschere di affinità personalizzate che specificano la risorsa di sistema da utilizzare per ognuno dei tipi di pool di thread gestiti da Analysis Services.
L'affinità personalizzata può essere impostata su uno dei cinque pool di thread utilizzati per i diversi carichi di lavoro di Analysis Services:
Analisi\Breve è un pool di analisi per le richieste brevi. Le richieste che rientrano in un singolo messaggio di rete vengono considerate brevi.
Analisi/Lunga è un pool di analisi per tutte le altre richieste che non rientrano in un singolo messaggio di rete.
[!NOTA]
Per eseguire una query è possibile utilizzare un thread da uno dei due pool di analisi. Le query eseguite rapidamente, ad esempio una richiesta veloce di individuazione o di annullamento, vengono eseguite immediatamente anziché essere accodate nel pool di thread di query.
Query è il pool di thread che esegue tutte le richieste che non vengono gestite dal pool di thread di analisi. Tramite i thread presenti nel pool di thread verranno eseguiti tutti i tipi di operazioni, ad esempio individuazioni e comandi MDX, DAX, DMX e DDL.
IOProcess viene utilizzato per i processi di I/O associati alle query del motore di archiviazione nel motore multidimensionale. Le operazioni eseguite da questi thread non dovranno avere dipendenze da altri thread. Tramite questi thread viene in genere eseguita l'analisi di un singolo segmento di una partizione e i dati del segmento vengono filtrati e aggregati. I thread IOProcess risentono in particolare delle configurazioni hardware NUMA. Di conseguenza, a questo pool di thread è associata la proprietà di configurazione PerNumaNode che è possibile utilizzare per l'ottimizzazione delle prestazioni, se necessario.
Processo è destinato ai processi del motore di archiviazione di più lunga durata, incluse le aggregazioni, l'indicizzazione e le operazioni di commit. Anche nella modalità di archiviazione ROLAP vengono utilizzati i thread dal pool dei thread di elaborazione.
[!NOTA]
Sebbene in Msmdsrv.ini siano presenti impostazioni del pool di thread nella sezione VertiPaq, VertiPaq\ThreadPool\GroupAffinity e ThreadPool\CPUs sono intenzionalmente non documentati. Queste proprietà sono attualmente non operative e sono riservate per utilizzo futuro.
Per elaborare le richieste, è possibile che in Analysis Services venga superato il limite massimo del pool di thread, richiedendo thread aggiuntivi qualora fossero necessari per completare l'attività. Quando tuttavia un thread completa l'esecuzione dell'attività, se il numero corrente di thread è maggiore del limite massimo, tale thread viene semplicemente terminato anziché restituito al pool di thread.
[!NOTA]
Il superamento del numero massimo del pool di thread è una protezione richiamata solo quando si verificano determinate condizioni di deadlock. Per impedire che vengano creati thread con eccessivo tempo di esecuzione oltre il limite massimo, una volta raggiunto tale limite i thread vengono creati gradualmente (dopo un breve ritardo). Il superamento del numero massimo di thread può provocare un rallentamento nell'esecuzione di attività. Se i contatori delle prestazioni indicano che il numero di thread supera regolarmente le dimensioni massime del pool di thread, è opportuno considerare tale informazione come un indicatore che le dimensioni del pool di thread sono troppo ridotte rispetto al livello di concorrenza richiesto dal sistema.
Per impostazione predefinita, le dimensioni del pool di thread sono determinate da Analysis Services e sono basate sul numero di core. È possibile osservare i valori predefiniti selezionati esaminando il file msmdsrv.log dopo l'avvio del server. Come pratica di ottimizzazione delle prestazioni, è possibile scegliere di aumentare le dimensioni del pool di thread e altre proprietà, al fine di migliorare le prestazioni di elaborazione o delle query.
Riferimento alle proprietà dei pool di thread
In questa sezione vengono descritte le proprietà dei pool di thread individuate nel file msmdsrv.ini di ogni istanza di Analysis Services. Un subset di tali proprietà viene inoltre visualizzato in SQL Server Management Studio.
Le proprietà sono elencate in ordine alfabetico.
Nome |
Tipo |
Descrizione |
Predefinito |
Informazioni aggiuntive |
---|---|---|---|---|
IOProcess \ Concurrency |
double |
Valore a virgola mobile a precisione doppia che determina l'algoritmo per l'impostazione di una destinazione per il numero di thread che possono essere inseriti contemporaneamente in una coda. |
2.0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La concorrenza viene utilizzata per inizializzare i pool di thread, che vengono implementati utilizzando le porte di completamento I/O di Windows. Per ulteriori informazioni, vedere la pagina relativa alle porte di completamento I/O. Si applica solo ai modelli multidimensionali. |
IOProcess \ GroupAffinity |
string |
Matrice di valori esadecimali corrispondenti ai gruppi di processori nel sistema, usata per impostare l'affinità dei thread nel pool di thread IOProcess sui processori logici in ogni gruppo di processore. |
nessuno |
È possibile utilizzare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per informazioni dettagliate, vedere Set GroupAffinity. Si applica solo ai modelli multidimensionali. |
IOProcess \ MaxThreads |
int |
Intero con segno a 32 bit che definisce il numero massimo di thread da includere nel pool di thread. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Per impostazione predefinita, questo valore viene impostato dal server su 64 o su 10 volte il numero di processori logici, a seconda del valore maggiore. Ad esempio, in un sistema a 4 core con hyperthreading, il numero massimo di pool di thread è 80. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. Quando ad esempio viene impostato su -10 in un server con 32 processori logici, il numero massimo sarà di 320 thread. Il valore massimo dipende dai processori disponibili per qualsiasi maschera di affinità personalizzata definita in precedenza. Ad esempio, se l'affinità del pool di thread è già impostata per l'utilizzo di 8 dei 32 processori e si imposta il valore MaxThreads su -10, il limite superiore per il pool di thread sarà 10 per 8 ovvero 80 thread. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. Si applica solo ai modelli multidimensionali. |
IOProcess \ MinThreads |
int |
Intero con segno a 32 bit che definisce il numero minimo di thread da preallocare per il pool di thread. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Per impostazione predefinita, il valore minimo è 1. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. Si applica solo ai modelli multidimensionali. |
IOProcess \ PerNumaNode |
int |
Intero con segno a 32 bit che determina il numero dei pool di thread creati per il processo msmdsrv. |
-1 |
I valori validi sono -1, 0, 1, 2. -1 = una strategia del pool di thread I/O diversa viene selezionata dal server in base al numero di nodi NUMA. Nei sistemi con meno di 4 nodi NUMA, il comportamento del server è uguale a 0 (viene creato un pool di thread IOProcess per il sistema). Nei sistemi con 4 o più nodi, il comportamento è uguale a 1 (vengono creati pool di thread IOProcess per ogni nodo). 0 = vengono disabilitati i pool di thread per nodo NUMA in modo che sia presente un solo un pool di thread IOProcess utilizzato dal processo msmdsrv.exe. 1 = viene abilitato un solo pool di thread IOProcess per nodo NUMA. 2 = un solo pool di thread IOProcess per processore logico. Per i thread in ogni pool di thread viene creata un'affinità con il nodo NUMA del processore logico e come processore ideale viene impostato il processore logico. Per informazioni dettagliate, vedere Set PerNumaNode. Si applica solo ai modelli multidimensionali. |
IOProcess \ PriorityRatio |
int |
Intero con segno a 32 bit che può essere utilizzato per accertarsi che i thread con priorità più bassa vengano talvolta eseguiti anche quando una coda con priorità più alta non è vuota. |
2 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. Si applica solo ai modelli multidimensionali. |
IOProcess \ StackSizeKB |
int |
Intero con segno a 32 bit che può essere utilizzato per modificare l'allocazione di memoria durante l'esecuzione del thread. |
0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. Si applica solo ai modelli multidimensionali. |
Parsing \ Long \ Concurrency |
double |
Valore a virgola mobile a precisione doppia che determina l'algoritmo per l'impostazione di una destinazione per il numero di thread che possono essere inseriti contemporaneamente in una coda. |
2.0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La concorrenza viene utilizzata per inizializzare i pool di thread, che vengono implementati utilizzando le porte di completamento I/O di Windows. Per ulteriori informazioni, vedere la pagina relativa alle porte di completamento I/O. |
Parsing \ Long \ GroupAffinity |
string |
Matrice di valori esadecimali corrispondenti ai gruppi di processori nel sistema, usata per impostare l'affinità di thread per l'analisi sui processori logici in ogni gruppo di processore. |
nessuno |
È possibile utilizzare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per informazioni dettagliate, vedere Set GroupAffinity. |
Parsing \ Long \ NumThreads |
int |
Proprietà a valore integer a 32 bit con segno che definisce il numero di thread che è possibile creare per comandi lunghi. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Il comportamento predefinito consiste nell'impostare NumThreads su un valore assoluto o su 2 volte il numero di processori logici, a seconda del valore maggiore. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. Quando ad esempio viene impostato su -10 in un server con 32 processori logici, il numero massimo sarà di 320 thread. Il valore massimo dipende dai processori disponibili per qualsiasi maschera di affinità personalizzata definita in precedenza. Ad esempio, se l'affinità del pool di thread è già impostata per l'utilizzo di 8 dei 32 processori e si imposta il valore NumThreads su -10, il limite superiore per il pool di thread sarà 10 per 8 ovvero 80 thread. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. |
Parsing \ Long \ PriorityRatio |
int |
Intero con segno a 32 bit che può essere utilizzato per accertarsi che i thread con priorità più bassa vengano talvolta eseguiti anche quando una coda con priorità più alta non è vuota. |
0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Parsing \ Long \ StackSizeKB |
int |
Intero con segno a 32 bit che può essere utilizzato per modificare l'allocazione di memoria durante l'esecuzione del thread. |
0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Parsing \ Short \ Concurrency |
double |
Valore a virgola mobile a precisione doppia che determina l'algoritmo per l'impostazione di una destinazione per il numero di thread che possono essere inseriti contemporaneamente in una coda. |
2.0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La concorrenza viene utilizzata per inizializzare i pool di thread, che vengono implementati utilizzando le porte di completamento I/O di Windows. Per ulteriori informazioni, vedere la pagina relativa alle porte di completamento I/O. |
Parsing \ Short \ GroupAffinity |
string |
Matrice di valori esadecimali corrispondenti ai gruppi di processori nel sistema, usata per impostare l'affinità di thread per l'analisi sui processori logici in ogni gruppo di processore. |
nessuno |
È possibile utilizzare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per informazioni dettagliate, vedere Set GroupAffinity. |
Parsing \ Short \ NumThreads |
int |
Proprietà di tipo intero con segno a 32 bit che consente di definire il numero di thread che è possibile creare per comandi brevi. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Il comportamento predefinito consiste nell'impostare NumThreads su un valore assoluto o su 2 volte il numero di processori logici, a seconda del valore maggiore. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. Quando ad esempio viene impostato su -10 in un server con 32 processori logici, il numero massimo sarà di 320 thread. Il valore massimo dipende dai processori disponibili per qualsiasi maschera di affinità personalizzata definita in precedenza. Ad esempio, se l'affinità del pool di thread è già impostata per l'utilizzo di 8 dei 32 processori e si imposta il valore NumThreads su -10, il limite superiore per il pool di thread sarà 10 per 8 ovvero 80 thread. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. |
Parsing \ Short \ PriorityRatio |
int |
Intero con segno a 32 bit che può essere utilizzato per accertarsi che i thread con priorità più bassa vengano talvolta eseguiti anche quando una coda con priorità più alta non è vuota. |
0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Parsing \ Short \ StackSizeKB |
int |
Intero con segno a 32 bit che può essere utilizzato per modificare l'allocazione di memoria durante l'esecuzione del thread. |
64* processori logici |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Process \ Concurrency |
double |
Valore a virgola mobile a precisione doppia che determina l'algoritmo per l'impostazione di una destinazione per il numero di thread che possono essere inseriti contemporaneamente in una coda. |
2.0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La concorrenza viene utilizzata per inizializzare i pool di thread, che vengono implementati utilizzando le porte di completamento I/O di Windows. Per ulteriori informazioni, vedere la pagina relativa alle porte di completamento I/O. |
Process \ GroupAffinity |
string |
Matrice di valori esadecimali corrispondenti ai gruppi di processori nel sistema, usata per impostare l'affinità dei thread di elaborazione sui processori logici in ogni gruppo di processore. |
nessuno |
È possibile utilizzare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per informazioni dettagliate, vedere Set GroupAffinity. |
Process \ MaxThreads |
int |
Intero con segno a 32 bit che definisce il numero massimo di thread da includere nel pool di thread. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Per impostazione predefinita, questo valore viene impostato dal server sul valore assoluto 64 o sul numero di processori logici, a seconda del valore maggiore. Ad esempio, in un sistema a 64 core con hyperthreading abilitato (pari a 128 processori logici), il numero massimo di pool di thread è 128. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. Quando ad esempio viene impostato su -10 in un server con 32 processori logici, il numero massimo sarà di 320 thread. Il valore massimo dipende dai processori disponibili per qualsiasi maschera di affinità personalizzata definita in precedenza. Ad esempio, se l'affinità del pool di thread è già impostata per l'utilizzo di 8 dei 32 processori e si imposta il valore MaxThreads su -10, il limite superiore per il pool di thread sarà 10 per 8 ovvero 80 thread. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. |
Process \ MinThreads |
int |
Intero con segno a 32 bit che definisce il numero minimo di thread da preallocare per il pool di thread. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Per impostazione predefinita, il valore minimo è 1. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. |
Process \ PriorityRatio |
int |
Intero con segno a 32 bit che può essere utilizzato per accertarsi che i thread con priorità più bassa vengano talvolta eseguiti anche quando una coda con priorità più alta non è vuota. |
2 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Process \ StackSizeKB |
int |
Intero con segno a 32 bit che può essere utilizzato per modificare l'allocazione di memoria durante l'esecuzione del thread. |
0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Query \ Concurrency |
double |
Valore a virgola mobile a precisione doppia che determina l'algoritmo per l'impostazione di una destinazione per il numero di thread che possono essere inseriti contemporaneamente in una coda. |
2.0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La concorrenza viene utilizzata per inizializzare i pool di thread, che vengono implementati utilizzando le porte di completamento I/O di Windows. Per ulteriori informazioni, vedere la pagina relativa alle porte di completamento I/O. |
Query \ GroupAffinity |
string |
Matrice di valori esadecimali corrispondenti ai gruppi di processori nel sistema, usata per impostare l'affinità dei thread di elaborazione sui processori logici in ogni gruppo di processore. |
nessuno |
È possibile utilizzare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per informazioni dettagliate, vedere Set GroupAffinity. |
Query \ MaxThreads |
int |
Intero con segno a 32 bit che definisce il numero massimo di thread da includere nel pool di thread. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Per impostazione predefinita, questo valore viene impostato dal server sul valore assoluto 10 o su 2 volte il numero di processori logici, a seconda del valore maggiore. Ad esempio, in un sistema a 4 core con hyperthreading, il numero massimo di thread è 16. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. Quando ad esempio viene impostato su -10 in un server con 32 processori logici, il numero massimo sarà di 320 thread. Il valore massimo dipende dai processori disponibili per qualsiasi maschera di affinità personalizzata definita in precedenza. Ad esempio, se l'affinità del pool di thread è già impostata per l'utilizzo di 8 dei 32 processori e si imposta il valore MaxThreads su -10, il limite superiore per il pool di thread sarà 10 per 8 ovvero 80 thread. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. |
Query \ MinThreads |
int |
Intero con segno a 32 bit che definisce il numero minimo di thread da preallocare per il pool di thread. |
0 |
0 indica che le impostazioni predefinite vengono determinate dal server. Per impostazione predefinita, il valore minimo è 1. Se si imposta questo numero su un valore negativo, tale valore viene moltiplicato dal server per il numero di processori logici. I valori effettivi utilizzati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv all'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. |
Query \ PriorityRatio |
int |
Intero con segno a 32 bit che può essere utilizzato per accertarsi che i thread con priorità più bassa vengano talvolta eseguiti anche quando una coda con priorità più alta non è vuota. |
2 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Query \ StackSizeKB |
int |
Intero con segno a 32 bit che può essere utilizzato per modificare l'allocazione di memoria durante l'esecuzione del thread. |
0 |
Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Impostare GroupAffinity per creare affinità fra thread e processori in un gruppo di processori
GroupAffinity viene fornita per scopi di ottimizzazione avanzati. È possibile utilizzare la proprietà GroupAffinity per impostare l'affinità tra i pool di thread di Analysis Services e processori specifici. Tuttavia, per la maggior parte delle installazioni, le stime migliori vengono eseguite da Analysis Services quando possono essere utilizzati tutti i processori logici disponibili. Pertanto, l'affinità di gruppo non viene specificata per impostazione predefinita.
Se il test delle prestazioni indica che è necessario ottimizzare la CPU, è possibile considerare un approccio di livello superiore, ad esempio tramite Gestione risorse di Windows Server per impostare l'affinità tra i processori logici e un processo server. Tale approccio risulta più semplice da implementare e gestire rispetto alla definizione di affinità personalizzate per singoli pool di thread.
Se l'approccio risulta insufficiente, è possibile ottenere maggiore precisione definendo affinità personalizzate per pool di thread. È più probabile che la personalizzazione delle impostazioni di affinità venga consigliata per sistemi multicore di grandi dimensioni (sia NUMA che non NUMA) in cui si verifica una riduzione del livello delle prestazioni a causa della distribuzione di pool di thread su un numero eccessivo di processori. Sebbene sia possibile impostare GroupAffinity su sistemi con meno di 64 processori logici, il vantaggio è irrilevante e può persino influire negativamente sulle prestazioni.
[!NOTA]
GroupAffinity è vincolata da edizioni che limitano il numero di core utilizzati da Analysis Services. All'avvio, le informazioni sull'edizione e sulle proprietà GroupAffinity vengono utilizzate in Analysis Services per calcolare le maschere di affinità per ognuno dei 5 pool di thread gestiti da Analysis Services. Nell'edizione standard è possibile utilizzare al massimo 16 core. Se si installa Analysis Services Standard Edition in un sistema multicore di grandi dimensioni con più di 16 core, in Analysis Services ne verranno utilizzati solo 16. Se si aggiorna un'istanza Enterprise di una versione precedente, sarà possibile utilizzare al massimo 20 core. Per ulteriori informazioni sulle versioni e sulle licenze, vedere Panoramica sulle licenze di SQL Server 2012.
Sintassi
Il valore è di tipo esadecimale per ogni gruppo di processori e rappresenta i processori logici utilizzati inizialmente in Analysis Services quando vengono allocati thread per un determinato pool di thread.
Maschera di bit per processori logici
È possibile che in un singolo gruppo di processori siano presenti un massimo di 64 processori logici. La maschera di bit è 1 (o 0) per ogni processore logico nel gruppo utilizzato (o non utilizzato) da un pool di thread. Dopo aver calcolato la maschera di bit, si calcolerà il valore esadecimale come valore per GroupAffinity.
Gruppi con più processori
I gruppi di processori vengono determinati all'avvio del sistema. GroupAffinity accetta valori esadecimali per ogni gruppo di processori in un elenco delimitato da virgole. In presenza di più gruppi di processori (fino a 10 nei sistemi di fascia più alta), è possibile ignorare singoli gruppi specificando 0x0. Ad esempio, in un sistema con quattro gruppi di processori (0, 1, 2, 3), è possibile escludere i gruppi 0 e 2 specificando 0x0 per il primo e il terzo valore.
<GroupAffinity>0x0, 0xFF, 0x0, 0xFF</GroupAffinity>
Passaggi per calcolare la maschera di affinità processori
È possibile impostare GroupAffinity nel file msmdsrv.ini o nelle pagine delle proprietà del server in SQL Server Management Studio.
Determinare il numero di processori e i gruppi di processori
È possibile scaricare l'utilità Coreinfo da Windows Sysinternals.
Eseguire coreinfo per ottenere tali informazioni dalla sezione relativa al mapping tra processori logici e gruppi. Per ogni processore logico viene generata una riga separata.
Numerare i processori da destra a sinistra: 7654 3210
L'esempio mostra solo 8 processori (da 0 a 7), mentre un gruppo di processori può includere un massimo di 64 processori logici e in un server Windows di livello aziendale possono essere presenti fino a 10 gruppi di processori.
Calcolare la maschera di bit per i gruppi di processori che si desidera utilizzare
7654 3210
Sostituire il numero con 0 o 1, a seconda che si desideri escludere o includere il processore logico. In un sistema con otto processori il calcolo potrebbe essere simile al seguente se si desidera utilizzare i processori 7, 6, 5, 4 e 1 per Analysis Services:
1111 0010
Convertire il numero binario in un valore esadecimale
Utilizzando una calcolatrice o uno strumento di conversione, convertire il numero binario nell'equivalente esadecimale. In questo esempio, 1111 0010 viene convertito in 0xF2.
Immettere il valore esadecimale nella proprietà GroupAffinity
Nel file msmdsrv.ini o nella pagina delle proprietà del server in Management Studio impostare GroupAffinity sul valore calcolato nel passaggio 4.
Importante |
---|
L'impostazione di GroupAffinity è un'attività manuale che include più passaggi. Quando si calcola GroupAffinity, verificare i calcoli con attenzione. Anche se Analysis Services restituisce un errore se l'intera maschera non è valida, in presenza di una combinazione di impostazioni valide e non valide la proprietà viene ignorata in Analysis Services. Se ad esempio la maschera di bit include valori aggiuntivi, in Analysis Services l'impostazione viene ignorata e vengono utilizzati tutti i processori nel sistema. Quando si verifica questa azione, non viene generato alcun errore o avviso per informare l'utente, ma è possibile controllare il file msmdsrv.log per sapere come sono effettivamente impostate le affinità. |
Impostare PerNumaNode per creare affinità fra i thread I/O e i processori in un nodo NUMA
Per le istanze multidimensionali di Analysis Services, è possibile impostare PerNumaNode nel pool di thread IOProcess per ottimizzare ulteriormente la pianificazione e l'esecuzione dei thread. Mentre con GroupAffinity viene identificato il set di processori logici da utilizzare per un pool di thread specificato, con PerNumaNode viene specificato se dovranno essere creati più pool di thread, creando per essi un'ulteriore affinità con qualche subset dei processori logici consentiti.
[!NOTA]
In Windows Server 2012 utilizzare Gestione attività per visualizzare il numero di nodi NUMA nel computer. In Gestione attività selezionare CPU nella scheda Prestazioni, quindi fare clic con il pulsante destro del mouse sull'area del grafico per visualizzare i nodi NUMA. In alternativa, scaricare l'utilità Coreinfo da Windows Sysinternals ed eseguire coreinfo –n per restituire i nodi NUMA e i processori logici in ogni nodo.
I valori validi per PerNumaNode sono -1, 0, 1, 2, come descritto nella sezione Thread Pool Property Reference in questo argomento.
Impostazione predefinita (consigliata)
Nei sistemi con nodi NUMA è consigliabile utilizzare l'impostazione predefinita PerNumaNode=-1, consentendo la modifica tramite Analysis Services del numero di pool di thread e la relativa affinità di thread in base al numero di nodi. Se nel sistema sono presenti meno di 4 nodi, in Analysis Services vengono implementati i comportamenti descritti in PerNumaNode=0, mentre PerNumaNode=1 viene utilizzato nei sistemi con 4 o più nodi.
Scelta di un valore
È inoltre possibile ignorare l'impostazione predefinita per utilizzare un altro valore valido.
Impostazione di PerNumaNode=0
I nodi NUMA vengono ignorati. Sarà presente un solo pool di thread IOProcess e per tutti i thread in tale pool di thread verrà creata un'affinità con tutti i processori logici. Per impostazione predefinita (dove PerNumaNode=-1), questa è l'impostazione operativa se nel computer sono presenti meno di 4 nodi NUMA.
Impostazione di PerNumaNode=1
Vengono creati pool di thread IOProcess per ogni nodo NUMA. L'utilizzo di pool di thread distinti consente l'accesso coordinato alle risorse locali, ad esempio la cache locale in un nodo NUMA.
Impostazione di PerNumaNode=2
Questa impostazione è destinata a sistemi di fascia molto alta nei quali viene eseguita un'elevata quantità di carichi di lavoro di Analysis Services. L'affinità del pool di thread IOProcess, al massimo livello di granularità, viene impostata da questa proprietà, creando pool di thread distinti e impostando la relativa affinità a livello di processore logico.
Nell'esempio seguente, in un sistema con 4 nodi NUMA e 32 processori logici l'impostazione di PerNumaNode su 2 produrrebbe 32 pool di thread IOProcess. Per i primi 8 pool di thread verrebbe creata un'affinità tra i thread e tutti i processori logici presenti nel nodo NUMA 0, ma con il processore ideale impostato su 0, 1, 2, fino a 7. Per i successivi 8 pool di thread verrebbe creata un'affinità con tutti i processori logici presenti nel nodo NUMA 1, con il processore ideale impostato su 8, 9, 10, fino a 15, e così via.
A questo livello di affinità, l'utilità di pianificazione effettua sempre il tentativo di utilizzare per primo il processore logico ideale all'interno del nodo NUMA preferito. Se il processore logico non è disponibile, tramite l'utilità di pianificazione viene scelto un altro processore nello stesso nodo o all'interno dello stesso gruppo di processori in assenza di altri thread disponibili. Per ulteriori informazioni ed esempi, vedere la pagina relativa alle impostazioni di configurazione di Analysis Services 2012 (blog di Wordpress).
Distribuzione del lavoro fra thread IOProcess
Quando si valuta se impostare la proprietà PerNumaNode, può essere utile conoscere come vengono utilizzati i thread IOProcess per prendere decisioni più pertinenti.
Tenere presente che IOProcess viene utilizzato per i processi di I/O associati alle query del motore di archiviazione nel motore multidimensionale.
Quando viene analizzato un segmento, il motore identifica la partizione a cui appartiene il segmento e tenta di accodare il processo del segmento al pool di thread utilizzato dalla partizione. In generale, le attività di tutti i segmenti appartenenti a una partizione verranno inseriti nella coda dello stesso pool di thread. Nei sistemi NUMA questo comportamento è particolarmente vantaggioso, in quanto per tutte le analisi di una partizione verrà utilizzata la memoria nella cache del file system allocata localmente a tale nodo NUMA.
Negli scenari seguenti vengono indicate le modifiche che talvolta possono migliorare le prestazioni delle query nei sistemi NUMA:
Per i gruppi di misure sotto-partizionati, ad esempio con una singola partizione, aumentare il numero di partizioni. Se viene utilizzata una sola partizione, le attività verranno sempre accodate dal motore in un solo pool di thread (pool di thread 0). L'aggiunta di più partizioni consente al motore di utilizzare pool di thread aggiuntivi.
In alternativa, se non è possibile creare partizioni aggiuntive, provare a impostare PerNumaNode=0 come metodo per aumentare il numero di thread disponibili per il pool di thread 0.
Per i database in cui le analisi dei segmenti vengono distribuite uniformemente tra più partizioni, l'impostazione di PerNumaNode su 1 o 2 può migliorare le prestazioni di query, in quanto viene aumentato il numero complessivo di pool di thread IOProcess utilizzati dal sistema.
Per soluzioni con più partizioni, in cui solo una viene analizzata frequentemente, provare a impostare PerNumaNode=0 per verificare se è possibile migliorare le prestazioni.
Sebbene sia nelle analisi delle dimensioni sia in quelle delle partizioni venga usato il pool di thread IOProcess, solo nelle analisi delle dimensioni viene usato il pool di thread 0. Ciò può generare un carico leggermente irregolare nel pool di thread in questione, ma lo sbilanciamento dovrebbe essere temporaneo, in quanto le analisi delle dimensioni tendono a essere molto veloci e rare.
[!NOTA]
Quando si modifica una proprietà del server, tenere presente che l'opzione di configurazione viene applicata a tutti i database in esecuzione nell'istanza corrente. Scegliere impostazioni utili per i database più importanti o per il numero più elevato di database. Non è possibile impostare l'affinità dei processori a livello di database, né è possibile impostarla tra le singole partizioni e specifici processori.
Per ulteriori informazioni sull'architettura dei processi, vedere la sezione 2.2 nella Guida alle prestazioni di SQL Server 2008 R2 Analysis Services.
Proprietà dipendenti o correlate
Come illustrato nella sezione 2.4 della Guida operativa di Analysis Services, se si aumenta il pool dei thread di elaborazione, assicurarsi che nelle impostazioni di CoordinatorExecutionMode e di CoordinatorQueryMaxThreads siano presenti valori che consentono di utilizzare completamente le maggiori dimensioni del pool di thread.
In Analysis Services viene utilizzato un thread coordinator per raccogliere i dati necessari per completare una richiesta di elaborazione o di query. Tramite questo thread viene dapprima accodato un processo per ogni partizione interessata. Da ognuno di questi processi continuano a essere accodati più processi, a seconda del numero complessivo di segmenti da analizzare nella partizione.
Il valore predefinito per CoordinatorExecutionMode è -4, ovvero un limite di 4 processi in parallelo per core, che vincola il numero totale di processi coordinatore eseguibili in parallelo da una richiesta di sottocubo nel motore di archiviazione.
Il valore predefinito per CoordinatorQueryMaxThreads è 16, che limita il numero di processi del segmento eseguibili in parallelo per ogni partizione.
Determinare le impostazioni del pool di thread corrente
A ogni avvio del servizio, tramite Analysis Services vengono restituite nel file msmdsrv.log le impostazioni del pool di thread corrente, inclusi i thread minimi e massimi, la maschera di affinità dei processori e la concorrenza.
L'esempio seguente è un estratto dal file di log, che mostra le impostazioni predefinite del pool di thread Query (MinThread=0, MaxThread=0, Concurrency=2), in un sistema a 4 core con hyperthreading abilitato. La maschera di affinità è 0xFF, che corrisponde a 8 processori logici. Si noti che alla maschera vengono anteposti zeri iniziali. Gli zeri iniziali possono essere ignorati.
"10/28/2013 9:20:52 AM) Message: The Query thread pool now has 1 minimum threads, 16 maximum threads, and a concurrency of 16. Its thread pool affinity mask is 0x00000000000000ff. (Source: \\?\C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Log\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x4121000A)"
Tenere presente che l'algoritmo per impostare MinThread e MaxThread incorpora la configurazione di sistema, in particolare il numero di processori. Il seguente post di blog offre informazioni sulle modalità di calcolo dei valori: Impostazioni di configurazione di Analysis Services 2012 (blog di Wordpress). Si noti che tali impostazioni e comportamenti sono soggetti a modifica nelle versioni future.
Nell'elenco seguente vengono illustrati esempi di altre impostazioni della maschera di affinità per diverse combinazioni di processori:
L'affinità per i processori 3-2-1-0 in un sistema con 8 core produce la maschera di bit: 00001111 e il valore esadecimale: 0xF
L'affinità per i processori 7-6-5-4 in un sistema con 8 core produce la maschera di bit: 11110000 e il valore esadecimale: 0xF0
L'affinità per i processori 5-4-3-2 in un sistema con 8 core produce la maschera di bit: 00111100 e il valore esadecimale: 0x3C
L'affinità per i processori 7-6-1-0 in un sistema con 8 core produce la maschera di bit: 11000011 e il valore esadecimale: 0xC3
Tenere presente che nei sistemi con più gruppi di processori viene generata una maschera di affinità separata per ogni gruppo, in un elenco delimitato da virgole.
Informazioni su MSMDSRV.INI
Il file msmdsrv.ini contiene le impostazioni di configurazione per un'istanza di Analysis Services, che influisce su tutti i database in esecuzione in tale istanza. Non è possibile utilizzare le proprietà di configurazione del server per ottimizzare le prestazioni di un solo database escludendo tutti gli altri. È tuttavia possibile installare più istanze di Analysis Services e configurare ogni istanza per l'utilizzo di proprietà utili per i database che condividono caratteristiche o carichi di lavoro simili.
Nel file msmdsrv.ini sono incluse tutte le proprietà di configurazione del server. Subset delle proprietà più probabilmente soggetti a modifica vengono visualizzati anche in strumenti di amministrazione, quale SSMS.
Il contenuto del file msmdsrv.ini è identico sia per le istanze tabulari sia per quelle multidimensionali di Analysis Services. Alcune impostazioni vengono tuttavia applicate a una sola modalità. Le differenze di comportamento in base alla modalità server sono indicate nella documentazione di riferimento della proprietà.
[!NOTA]
Per istruzioni su come impostare le proprietà, vedere Configurare le proprietà del server in Analysis Services.
Vedere anche
Altre risorse
Informazioni su processi e thread
Modifiche del pool di thread di Analysis Services in SQL Server 2012
Impostazioni di configurazione di Analysis Services 2012 (blog di Wordpress)