Proprietà dei pool di thread
Analysis Services usa il multithreading per molte operazioni, migliorando le prestazioni complessive del server eseguendo più processi in parallelo. Per gestire i thread in modo più efficiente, Analysis Services usa i pool di thread per preallocare i thread e facilitare la disponibilità dei thread per il processo successivo.
Ogni istanza di Analysis Services gestisce il proprio set di pool di thread. Esistono differenze significative nel modo in cui i pool di thread vengono usati dalle istanze tabulari e da quelle multidimensionali. La differenza più importante è che solo le soluzioni multidimensionali usano il pool di IOProcess
thread. Di conseguenza, la proprietà PerNumaNode
, descritta in questo argomento, non è significativa per le istanze tabulari.
In questo argomento sono incluse le sezioni seguenti:
Impostare GroupAffinity per affinizzare i thread ai processori in un gruppo di processori
Determinazione delle impostazioni correnti dei pool di thread
Nota
La distribuzione tabulare nei sistemi NUMA non rientra nell'ambito di questo argomento. Sebbene le soluzioni tabulari possano essere distribuite correttamente nei sistemi NUMA, le caratteristiche di prestazioni della tecnologia di database in memoria usata dai modelli tabulari possono mostrare vantaggi limitati nelle architetture con scalabilità verticale accentuata. Per altre informazioni, vedere Case study di Analysis Services: uso di modelli tabulari in una soluzione commerciale su vasta scala e Ridimensionamento hardware di una soluzione tabulare.
Gestione di thread in Analysis Services
Analysis Services usa il multithreading per sfruttare le risorse della CPU disponibili aumentando il numero di attività in esecuzione in parallelo. Il motore di archiviazione è multithread. Esempi di processi multithread che vengono eseguiti nel motore di archiviazione includono l'elaborazione di oggetti in parallelo o la gestione di query discrete che siano state inviate al motore di archiviazione, nonché la restituzione di valori di dati richiesti da una query. Il motore delle formule, a causa della natura seriale dei calcoli che valuta, è a thread singolo. Ogni query viene eseguita principalmente su un solo thread, richiedendo e spesso restando in attesa dei dati restituiti dal motore di archiviazione. I thread di query hanno tempi di esecuzione più lunghi e vengono rilasciati solo al termine dell'esecuzione dell'intera query.
Per impostazione predefinita, nelle versioni SQL Server 2012 e versioni successive, Analysis Services userà tutti i processori logici disponibili, fino a 640 nei sistemi che eseguono edizioni superiori di Windows e SQL Server. All'avvio, il processo msmdsrv.exe verrà assegnato a uno specifico gruppo di processori, ma successivamente i thread potranno essere pianificati in qualsiasi processore logico, 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 in un numero elevato di processori, con il conseguente aumento della contesa per le strutture dei dati condivisi. Questa situazione si può verificare in particolare nei sistemi avanzati che usano l'architettura NUMA, ma anche nei sistemi non NUMA che eseguono più applicazioni con elevate quantità di dati nello stesso hardware.
Per risolvere questo problema, è possibile impostare l'affinità tra i tipi di operazioni di Analysis Services e un set specifico di processori logici. La GroupAffinity
proprietà consente di creare maschere di affinità personalizzate che specificano la risorsa di sistema da usare 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 usati per vari carichi di lavoro di Analysis Services:
L'analisi \ Short è un pool di analisi per richieste brevi. Le richieste che rientrano in un singolo messaggio di rete vengono considerate brevi.
L'analisi \ Long è un pool di analisi per tutte le altre richieste che non rientrano in un singolo messaggio di rete.
Nota
Per eseguire una query è possibile usare un thread di entrambi i pool di analisi. Le query che vengono eseguite rapidamente, ad esempio le richieste rapide di individuazione o annullamento, vengono talvolta eseguite immediatamente piuttosto che essere messe in coda nel pool di thread di query.
Query
è il pool di thread che esegue tutte le richieste non gestite dal pool di thread di analisi. I thread inclusi in questo pool di thread eseguiranno tutti i tipi di operazioni, ad esempio i comandi di individuazione, MDX, DAX, DMX e DDL.IOProcess
viene usato per i processi di I/O associati alle query del motore di archiviazione nel motore multidimensionale. Le operazioni eseguite da questi thread non dovrebbero 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.IOProcess
i thread sono particolarmente sensibili alle configurazioni hardware NUMA. Di conseguenza, questo pool di thread ha laPerNumaNode
proprietà di configurazione che può essere usata per ottimizzare le prestazioni, se necessario.Process
è per processi del motore di archiviazione di durata più lunga, incluse le aggregazioni, l'indicizzazione e le operazioni di commit. I thread del pool di thread Processing vengono usati anche dalla modalità di archiviazione ROLAP.
Nota
Anche se Msmdsrv.ini ha impostazioni del pool di thread nella VertiPaq
sezione\GroupAffinity
ThreadPool
VertiPaq
\ e ThreadPool
\CPUs
sono intenzionalmente non documentate. Queste proprietà sono attualmente non operative e sono riservate per utilizzo futuro.
Per gestire le richieste, Analysis Services può superare il limite massimo del pool di thread, richiedendo thread aggiuntivi se sono necessari per eseguire il lavoro. Tuttavia, alla fine dell'esecuzione dell'attività da parte di un thread, quest'ultimo viene semplicemente terminato, anziché essere restituito al pool di thread, qualora il numero corrente di thread è maggiore del limite massimo.
Nota
Il superamento del numero massimo di pool di thread è una protezione richiamata solo quando si verificano determinate condizioni di deadlock. Per impedire la creazione di thread sfuggiti al controllo oltre il limite massimo, i thread vengono creati gradualmente (dopo un breve intervallo) dopo che il limite massimo viene raggiunto. Il superamento del numero di thread massimo può provocare un rallentamento nell'esecuzione dell'attività. Se i contatori delle prestazioni indicano che il numero di thread supera regolarmente le dimensioni massime del pool di thread, è possibile desumere che le dimensioni dei pool di thread sono troppo piccole per il 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 esercizio di ottimizzazione delle prestazioni, è possibile scegliere di aumentare le dimensioni del pool di thread, nonché di modificare altre proprietà, per migliorare le prestazioni di elaborazione o di query.
Guida di riferimento alle proprietà dei pool di thread
Questa sezione descrive le proprietà del pool di thread disponibili nel file msmdsrv.ini di ogni istanza di Analysis Services. Una parte di queste proprietà è disponibile anche in SQL Server Management Studio.
Le proprietà sono elencate in ordine alfabetico.
Nome | Tipo | Descrizione | Predefinito | Indicazioni |
---|---|---|---|---|
IOProcess \ Concurrency |
double | Valore a virgola mobile a precisione doppia con cui si determina l'algoritmo usato per impostare una destinazione nel numero di thread che possono essere inseriti in una coda contemporaneamente. | 2.0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La proprietà Concurrency viene usata per inizializzare i pool di thread che vengono implementati usando le porte di completamento I/O di Windows. Per altre informazioni, vedere Porte di completamento I/O . Questa proprietà 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 processori. | none | È possibile usare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per altre informazioni, vedere Impostare GroupAffinity per creare affinità fra thread e processori in un gruppo di processori . Questa proprietà 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, tramite il server questo valore viene impostato sul valore più elevato tra 64 e un valore pari a 10 volte il numero di processori logici. Ad esempio, in un sistema con 4 core con Hyper-Threading, il numero massimo di thread per il pool di thread è 80. Se si imposta su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. Ad esempio, se è impostato su -10 in un server con 32 processori logici, il massimo è 320 thread. Il valore massimo è soggetto ai processori disponibili per tutte le maschere di affinità personalizzate definite in precedenza. Ad esempio, se è già stata impostata l'affinità del pool di thread in modo da usare 8 dei 32 processori e ora si imposta MaxThreads su -10, il limite superiore per il pool di thread sarà 10 volte 8 o 80 thread. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. Questa proprietà 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 su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'avvio del servizio. Ulteriori informazioni sull'ottimizzazione delle impostazioni del pool di thread sono disponibili nella pagina relativa alla Guida operativa di Analysis Services. Questa proprietà 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 e 2 -1 = Il server seleziona una diversa strategia per i pool di thread di I/O in base al numero di nodi NUMA. Nei sistemi con meno di 4 nodi NUMA, il comportamento del server è analogo a 0 (viene creato un solo pool di thread IOProcess per il sistema). Nei sistemi con 4 o più nodi, il comportamento è analogo a 1 (vengono creati pool di thread IOProcess per ogni nodo). 0 = Disabilita i pool di thread per nodo NUMA in modo che sia presente solo un pool di thread IOProcess usato dal processo msmdsrv.exe. 1 = Abilita un singolo pool di thread IOProcess per ogni nodo NUMA. 2 = Un singolo pool di thread IOProcess per ogni processore logico. Per i thread di ogni pool di thread viene creata un'affinità al nodo NUMA del processore logico, con il processore ideale impostato sul processore logico. Per altre informazioni, vedere Impostare PerNumaNode per creare affinità fra i thread I/O e i processori in un nodo NUMA . Questa proprietà si applica solo ai modelli multidimensionali. |
IOProcess \ PriorityRatio |
INT | Intero con segno a 32 bit che può essere usato per assicurarsi 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. Questa proprietà si applica solo ai modelli multidimensionali. |
IOProcess \ StackSizeKB |
INT | Intero con segno a 32 bit che può essere usato per modificare l'allocazione di memoria durante l'esecuzione dei thread. | 0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. Questa proprietà si applica solo ai modelli multidimensionali. |
Analisi \ Long \ Concurrency |
double | Valore a virgola mobile a precisione doppia con cui si determina l'algoritmo usato per impostare una destinazione nel numero di thread che possono essere inseriti in una coda contemporaneamente. | 2.0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La proprietà Concurrency viene usata per inizializzare i pool di thread che vengono implementati usando le porte di completamento I/O di Windows. Per altre informazioni, vedere Porte di completamento I/O . |
Analisi \ Long \ GroupAffinity |
string | Matrice di valori esadecimali corrispondenti ai gruppi di processori nel sistema, usata per impostare l'affinità dei thread di analisi sui processori logici in ogni gruppo di processori. | none | È possibile usare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per altre informazioni, vedere Impostare GroupAffinity per creare affinità fra thread e processori in un gruppo di processori . |
Analisi \ 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 su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. Ad esempio, se è impostato su -10 in un server con 32 processori logici, il massimo è 320 thread. Il valore massimo è soggetto ai processori disponibili per tutte le maschere di affinità personalizzate definite in precedenza. Ad esempio, se è già stata impostata l'affinità del pool di thread in modo da usare 8 dei 32 processori e ora si imposta NumThreads su -10, il limite superiore per il pool di thread sarà 10 volte 8 o 80 thread. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'avvio del servizio. |
Analisi \ Long \ PriorityRatio |
INT | Intero con segno a 32 bit che può essere usato per assicurarsi 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. |
Analisi \ Long \ StackSizeKB |
INT | Intero con segno a 32 bit che può essere usato per modificare l'allocazione di memoria durante l'esecuzione dei thread. | 0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Analisi \ Short \ Concurrency |
double | Valore a virgola mobile a precisione doppia con cui si determina l'algoritmo usato per impostare una destinazione nel numero di thread che possono essere inseriti in una coda contemporaneamente. | 2.0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La proprietà Concurrency viene usata per inizializzare i pool di thread che vengono implementati usando le porte di completamento I/O di Windows. Per altre informazioni, vedere Porte di completamento I/O . |
Analisi \ Short \ GroupAffinity |
string | Matrice di valori esadecimali corrispondenti ai gruppi di processori nel sistema, usata per impostare l'affinità dei thread di analisi sui processori logici in ogni gruppo di processori. | none | È possibile usare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per altre informazioni, vedere Impostare GroupAffinity per creare affinità fra thread e processori in un gruppo di processori . |
Analisi \ Short \ NumThreads |
INT | Proprietà integer a 32 bit con segno che definisce 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 su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. Ad esempio, se è impostato su -10 in un server con 32 processori logici, il massimo è 320 thread. Il valore massimo è soggetto ai processori disponibili per tutte le maschere di affinità personalizzate definite in precedenza. Ad esempio, se è già stata impostata l'affinità del pool di thread in modo da usare 8 dei 32 processori e ora si imposta NumThreads su -10, il limite superiore per il pool di thread sarà 10 volte 8 o 80 thread. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'avvio del servizio. |
Analisi \ Short \ PriorityRatio |
INT | Intero con segno a 32 bit che può essere usato per assicurarsi 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. |
Analisi \ Short \ StackSizeKB |
INT | Intero con segno a 32 bit che può essere usato per modificare l'allocazione di memoria durante l'esecuzione dei thread. | 64 * numero di 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 con cui si determina l'algoritmo usato per impostare una destinazione nel numero di thread che possono essere inseriti in una coda contemporaneamente. | 2.0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La proprietà Concurrency viene usata per inizializzare i pool di thread che vengono implementati usando le porte di completamento I/O di Windows. Per altre informazioni, vedere 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 processori. | none | È possibile usare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per altre informazioni, vedere Impostare GroupAffinity per creare affinità fra thread e processori in un gruppo di processori . |
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, tramite il server questo valore viene impostato sul valore più elevato tra un valore assoluto pari a 64 e il numero di processori logici. Ad esempio, in un sistema con 64 core con Hyper-Threading abilitato (che determina 128 processori logici), il numero massimo di thread per il pool di thread è 128. Se si imposta su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. Ad esempio, se è impostato su -10 in un server con 32 processori logici, il massimo è 320 thread. Il valore massimo è soggetto ai processori disponibili per tutte le maschere di affinità personalizzate definite in precedenza. Ad esempio, se è già stata impostata l'affinità del pool di thread in modo da usare 8 dei 32 processori e ora si imposta MaxThreads su -10, il limite superiore per il pool di thread sarà 10 volte 8 o 80 thread. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'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 su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'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 usato per assicurarsi 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 usato per modificare l'allocazione di memoria durante l'esecuzione dei 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 con cui si determina l'algoritmo usato per impostare una destinazione nel numero di thread che possono essere inseriti in una coda contemporaneamente. | 2.0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. La proprietà Concurrency viene usata per inizializzare i pool di thread che vengono implementati usando le porte di completamento I/O di Windows. Per altre informazioni, vedere 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 processori. | none | È possibile usare questa proprietà per creare affinità personalizzate. La proprietà è vuota per impostazione predefinita. Per altre informazioni, vedere Impostare GroupAffinity per creare affinità fra thread e processori in un gruppo di processori . |
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, tramite il server questo valore viene impostato sul valore più elevato tra un valore assoluto pari a 10 e 2 volte il numero di processori logici. Ad esempio, in un sistema con 4 core con Hyper-Threading, il numero massimo di thread è 16. Se si imposta su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. Ad esempio, se è impostato su -10 in un server con 32 processori logici, il massimo è 320 thread. Il valore massimo è soggetto ai processori disponibili per tutte le maschere di affinità personalizzate definite in precedenza. Ad esempio, se è già stata impostata l'affinità del pool di thread in modo da usare 8 dei 32 processori e ora si imposta MaxThreads su -10, il limite superiore per il pool di thread sarà 10 volte 8 o 80 thread. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'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 su un valore negativo, il valore in questione viene moltiplicato dal server per il numero di processori logici. I valori effettivi usati per questa proprietà dei pool di thread vengono scritti nel file di log msmdsrv al momento dell'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 usato per assicurarsi 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 usato per modificare l'allocazione di memoria durante l'esecuzione dei thread. | 0 | Proprietà avanzata che deve essere modificata solo sotto la supervisione del servizio di supporto tecnico Microsoft. |
Impostazione di GroupAffinity per la creazione di affinità tra thread e processori in un gruppo di processori
GroupAffinity
viene fornita per scopi di ottimizzazione avanzati. È possibile usare la proprietà per impostare l'affinità GroupAffinity
tra pool di thread di Analysis Services e processori specifici. Tuttavia, per la maggior parte delle installazioni, Analysis Services risulta ottimale quando può usare tutti i processori logici disponibili. Pertanto, l'affinità di gruppo non viene specificata per impostazione predefinita.
Se il test delle prestazioni indica la necessità di eseguire l'ottimizzazione della CPU, può essere consigliabile adottare un approccio di livello superiore, ad esempio usando Gestione risorse di Windows Server per impostare l'affinità tra i processori logici e un processo server. Questo tipo di approccio può risultare più semplice da implementare e gestire rispetto alla definizione di affinità personalizzate per i singoli pool di thread.
Se tale approccio risulta insufficiente, è possibile ottenere una maggiore precisione tramite la definizione di affinità personalizzate per i pool di thread. È più probabile che la personalizzazione delle impostazioni di affinità sia consigliata su sistemi multicore di grandi dimensioni (sia NUMA che non NUMA) in cui si verifichi una riduzione del livello delle prestazioni a causa della distribuzione dei pool di thread su un insieme troppo ampio 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, Analysis Services usa le informazioni sull'edizione e le GroupAffinity
proprietà per calcolare le maschere di affinità per ognuno dei 5 pool di thread gestiti da Analysis Services. Nell'edizione standard è possibile usare al massimo 16 core. Se si installa Analysis Services Standard Edition in un sistema multicore di grandi dimensioni con più di 16 core, ne verranno utilizzati solo 16. Se si aggiorna un'istanza Enterprise di una versione precedente, sarà possibile usare al massimo 20 core. Per altre informazioni sulle versioni e sulle licenze, vedere Panoramica sulle licenze di SQL Server 2012.
Sintassi
Il valore è esadecimale per ogni gruppo di processori, con l'esadecimale che rappresenta i processori logici che Analysis Services tenta di usare prima di tutto quando si assegnano thread per un determinato pool di thread.
Maschera di bit per i processori logici
Ogni gruppo di processori può contenere al massimo 64 processori logici. La maschera di bit è pari a 1 (o 0) per ogni processore logico nel gruppo che viene usato (o non viene usato) da un pool di thread. Dopo aver calcolato la maschera di bit, si calcola quindi 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. Se sono presenti più gruppi di processori (fino a 10 nei sistemi di fascia superiore) è possibile ignorare i singoli gruppi specificando il valore 0x0. Ad esempio, in un sistema con quattro gruppi di processori (0, 1, 2, 3), si potrebbero escludere i gruppi 0 e 2 specificando 0x0 come primo e terzo valore.
<GroupAffinity>0x0, 0xFF, 0x0, 0xFF</GroupAffinity>
Passaggi per il calcolo della maschera di affinità per i processori
È possibile impostare GroupAffinity
in msmdsrv.ini o nelle pagine delle proprietà 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.
Sequenza dei processori, da destra a sinistra:
7654 3210
Nell'esempio vengono mostrati solo 8 processori (da 0 a 7), ma in ogni gruppo di processori vi possono essere fino a 64 processori logici, mentre nei sistemi server Windows più avanzati può essere presente un massimo di 10 gruppi di processori.
Calcolare la maschera di bit per i gruppi di processori da usare
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 in cui si desideri usare i processori 7, 6, 5, 4 e 1 per Analysis Services, il calcolo potrebbe essere simile al seguente:
1111 0010
Convertire il numero binario in un valore esadecimale
Usando una calcolatrice o uno strumento di conversione, convertire il numero binario nell'equivalente esadecimale. In questo esempio,
1111 0010
viene convertito in0xF2
.Immettere il valore esadecimale nella proprietà GroupAffinity
In msmdsrv.ini o nella pagina delle proprietà del server in Management Studio impostare
GroupAffinity
sul valore calcolato nel passaggio 4.
Importante
L'impostazione è un'attività GroupAffinity
manuale che include più passaggi. Quando si calcola GroupAffinity
, controllare attentamente i calcoli. Anche se Analysis Services restituirà un errore se l'intera maschera non è valida, una combinazione di impostazioni valide e non valide comporta l'ignorazione della proprietà. Ad esempio, se la maschera di bit include valori aggiuntivi, Analysis Services ignora l'impostazione, usando tutti i processori nel sistema. Non vengono visualizzati errori o avvisi quando si esegue questa azione, tuttavia è possibile controllare il file msmdsrv.log per informazioni sull'effettiva modalità di impostazione delle affinità.
Impostazione di PerNumaNode per la creazione di affinità tra thread di I/O e processori in un nodo NUMA
Per le istanze di Analysis Services multidimensionali, è possibile impostare PerNumaNode
nel pool di thread per ottimizzare ulteriormente la pianificazione e l'esecuzione IOProcess
del thread. Mentre GroupAffinity
identifica il set di processori logici da usare per un determinato pool di thread, va un ulteriore passaggio specificando se creare più pool di thread, PerNumaNode
affinizzati ulteriormente con alcuni subset dei processori logici consentiti.
Nota
In Windows Server 2012 usare Gestione attività per visualizzare il numero di nodi NUMA nel computer. Nella scheda Prestazioni di Gestione attività selezionare CPU , 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 Riferimento proprietà pool thread in questo argomento.
Impostazione predefinita (consigliato)
Nei sistemi con nodi NUMA è consigliabile usare l'impostazione predefinita di PerNumaNode=-1, consentendo ad Analysis Services di modificare il numero di pool di thread e la relativa affinità di thread in base al numero di nodi. Se il sistema ha meno di 4 nodi, Analysis Services implementa i comportamenti descritti da PerNumaNode
=0, mentre PerNumaNode
=1 viene usato nei sistemi con 4 o più nodi.
Scelta di un valore
È inoltre possibile sostituire l'impostazione predefinita per usare un altro valore valido.
Impostazione PerNumaNode=0
I nodi NUMA vengono ignorati. Sarà disponibile un solo pool di thread IOProcess e verrà creata un'affinità tra tutti i thread di questo pool di thread e tutti i processori logici. Per impostazione predefinita (dove PerNumaNode=-1), si tratta dell'impostazione operativa se il computer dispone di meno di 4 nodi NUMA.
Impostazione PerNumaNode=1
I pool di thread IOProcess vengono creati per ogni nodo NUMA. L'utilizzo di pool di thread distinti migliora l'accesso coordinato alle risorse locali, ad esempio alla cache locale su un nodo NUMA.
Impostazione PerNumaNode=2
Questa impostazione è destinata a sistemi molto high-end che eseguono carichi di lavoro di Analysis Services a elevato utilizzo. Questa proprietà imposta l'affinità del pool di thread IOProcess al livello di massima granularità, consentendo di creare pool di thread distinti e di impostarne l'affinità al livello del processore logico.
Nell'esempio seguente, in un sistema con 4 nodi NUMA e 32 processori logici, l'impostazione PerNumaNode
su 2 comporta 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 tenta sempre di usare per primo il processore logico ideale all'interno del nodo NUMA preferito. Se il processore logico non è disponibile, l'utilità di pianificazione sceglie un altro processore all'interno dello stesso nodo o, se non sono disponibili altri thread, all'interno dello stesso gruppo di processori. Per altre informazioni ed esempi, vedere Impostazioni di configurazione di Analysis Services 2012 (blog di Wordpress).
Distribuzione del lavoro tra thread IOProcess
Quando si considera se impostare la PerNumaNode
proprietà, sapere come IOProcess
vengono usati i thread può aiutare a prendere una decisione più informata.
Tenere presente che IOProcess
viene usato per i processi I/O associati alle query del motore di archiviazione nel motore multidimensionale.
Quando un segmento viene analizzato, tramite il motore viene identificata la partizione a cui appartiene il segmento e viene effettuato il tentativo di accodare il processo del segmento al pool di thread usato dalla partizione. In generale, le attività di tutti i segmenti che appartengono a una partizione verranno accodate allo stesso pool di thread. Nei sistemi NUMA, questo comportamento è particolarmente vantaggioso perché per tutte le analisi di una partizione verrà usata la memoria della cache del file system allocata in locale al nodo NUMA in questione.
Negli scenari seguenti vengono suggerite modifiche che talvolta possono migliorare le prestazioni delle query nei sistemi NUMA:
Per gruppi di misure con poche partizioni, ad esempio con una soltanto, aumentare il numero di partizioni. L'utilizzo di una sola partizione causerà l'accodamento continuo di attività in un pool di thread (pool di thread 0) da parte del motore. Se si aggiungono più partizioni, tramite il motore sarà possibile usare pool di thread aggiuntivi.
In alternativa, se non è possibile creare partizioni aggiuntive, provare a impostare
PerNumaNode
=0 come modo per aumentare il numero di thread disponibili per il pool di thread 0.Per i database in cui le analisi del segmento vengono distribuite uniformemente in più partizioni, l'impostazione
PerNumaNode
su 1 o 2 può migliorare le prestazioni delle query perché aumenta il numero complessivo di pool diIOProcess
thread usati dal sistema.Per le soluzioni che dispongono di più partizioni, ma solo una viene analizzata in modo pesante, provare a impostare
PerNumaNode
=0 per verificare se migliora le prestazioni.
Anche se entrambe le analisi di partizione e dimensione usano il pool di thread, le analisi delle dimensioni usano solo il IOProcess
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, si tenga presente che l'opzione di configurazione viene applicata a tutti i database in esecuzione nell'istanza corrente. Scegliere le impostazioni usate nei database più importanti o nel maggior numero di database. Non è possibile impostare l'affinità processori a livello di database, né è possibile impostare l'affinità tra singole partizioni e processori specifici.
Per altre informazioni sull'architettura del processo, vedere la sezione 2.2 nella guida alle prestazioni di SQL Server 2008 Analysis Services.
Proprietà dipendenti o correlate
Come illustrato nella sezione 2.4 della Guida alle operazioni di Analysis Services, se si aumenta il pool di thread di elaborazione, è necessario assicurarsi che le impostazioni, nonché le CoordinatorExecutionMode
CoordinatorQueryMaxThreads
impostazioni, dispongano di valori che consentono di usare completamente le dimensioni del pool di thread.
In Analysis Services viene usato un thread coordinatore, che raccoglie i dati necessari per completare le richieste di query o di elaborazione. Inizialmente, il coordinatore mette in coda un singolo processo per ogni partizione che deve essere toccata. Ognuno di questi processi continua quindi a mettere in coda altri processi, in base al numero complessivo di segmenti che devono essere analizzati nella partizione.
Il valore predefinito per CoordinatorExecutionMode
è -4, vale a dire un limite di 4 processi in parallelo per core, vincolando in questo modo il numero totale di processi coordinatore che possono essere eseguiti 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.
Determinazione delle impostazioni correnti dei pool di thread
In ogni avvio del servizio Analysis Services restituisce le impostazioni del pool di thread correnti nel file msmdsrv.log, inclusi thread minimi e massimi, maschera di affinità del processore e concorrenza.
L'esempio seguente è un estratto del file di log, che mostra le impostazioni predefinite per il pool di thread di query (MinThread=0, MaxThread=0, Concurrency=2) in un sistema con 4 core con Hyper-Threading abilitato. La maschera di affinità è 0xFF, valore che indica 8 processori logici. Si noti che gli zeri iniziali vengono aggiunti all'inizio della maschera. 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 post di blog seguente offre informazioni sulle modalità di calcolo dei valori: Impostazioni di configurazione di Analysis Services 2012 (blog di Wordpress). Si noti che queste impostazioni e questi comportamenti sono soggetti a modifica nelle versioni future.
Nell'elenco seguente vengono illustrati esempi di altre impostazioni di maschere di affinità, per diverse combinazioni di processori:
Affinità per processori 3-2-1-0 in sistemi con 8 core genera una maschera di bit: 00001111 e un valore esadecimale: 0xF
Affinità per processori 7-6-5-4 in sistemi con 8 core genera una maschera di bit: 11110000 e un valore esadecimale: 0xF0
Affinità per processori 5-4-3-2 in sistemi con 8 core genera una maschera di bit: 00111100 e un valore esadecimale: 0x3C
Affinità per processori 7-6-1-0 in sistemi con 8 core genera una maschera di bit: 11000011 e un 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 usare 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'uso di proprietà che traggono vantaggio dai database che condividono caratteristiche o carichi di lavoro simili.
Tutte le proprietà di configurazione del server sono incluse nel file msmdsrv.ini. Subset delle proprietà in genere maggiormente soggette a modifica vengono visualizzate anche negli strumenti di amministrazione, ad esempio in SSMS.
Il contenuto di msmdsrv.ini è identico per le istanze tabulari e multidimensionali di Analysis Services. Tuttavia, alcune impostazioni si applicano solo a una delle modalità. Le differenze di comportamento che dipendono dalla modalità del server sono indicate nella documentazione di riferimento della proprietà.
Nota
Per istruzioni su come impostare le proprietà, vedere Configure Server Properties in Analysis Services.
Vedere anche
Informazioni sui processi e i thread con più processori Gruppi di processori Analysis Services Thread Pool changes in SQL Server 2012 Analysis Services 2012 Configuration settings (Wordpress Blog)Support systems that have more than 64 Processors (Informazioni sulle modifiche del pool di thread di Analysis Services per più di 64 processori) in SQL Server 2012 Analysis Services 2012 Configuration Settings (Blog di Wordpress)Supporto di sistemi con più di 64 processori SQL Server 2008 R2 Analysis Services Operations Guide