Pool di risorse di Resource Governor
Si applica a: SQL Server Istanza gestita di SQL di Azure
In Resource Governor di SQL Server, un pool di risorse rappresenta un sottoinsieme delle risorse fisiche di un'istanza del motore di database. Resource Governor permette di specificare i limiti sulla quantità di CPU, I/O fisico e memoria che le richieste dell'applicazione in ingresso possono utilizzare nel pool di risorse. Ogni pool di risorse può contenere uno o più gruppi di carico di lavoro. Una volta avviata, la sessione viene assegnata a un gruppo di carico di lavoro specifico tramite la funzione di classificazione di Resource Governor e deve essere eseguita utilizzando le risorse assegnate a tale gruppo.
Concetti relativi al pool di risorse
Un pool di risorse, o pool, rappresenta le risorse fisiche del server. Il pool può essere paragonato a un'istanza di SQL Server virtuale in un'istanza di SQL Server. Un pool è composto da due parti. Una parte non si sovrappone agli altri pool, abilitando così la prenotazione delle risorse minime. L'altra parte è condivisa con gli altri pool e supporta l'utilizzo massimo possibile delle risorse. Le risorse del pool vengono definite specificando una o più delle seguenti impostazioni per ciascuna risorsa (CPU, memoria e I/O fisico):
MIN_CPU_PERCENT e MAX_CPU_PERCENT
Queste impostazioni rappresentano il valore minimo e massimo della larghezza di banda media garantita della CPU per tutte le richieste nel pool di risorse in caso di contesa delle risorse della CPU. È possibile utilizzare queste impostazioni per determinare l'utilizzo previsto delle risorse della CPU per più carichi di lavoro in base alle esigenze di ciascun carico di lavoro. Si supponga ad esempio che i reparti Vendita e Marketing di un'azienda condividano lo stesso database. Il reparto Vendita ha un carico di lavoro ad uso intensivo della CPU con query ad alta priorità. Anche il reparto Marketing ha un carico di lavoro ad uso intensivo della CPU, ma la priorità delle query è inferiore. Se si crea un pool di risorse distinto per ciascun reparto, è possibile assegnare una percentuale di CPU minima pari a 70 per il pool di risorse del reparto Vendita e una percentuale massima pari a 30 per il pool di risorse del reparto Marketing. Questa configurazione garantisce che il carico di lavoro del reparto Vendita riceva le risorse della CPU necessarie e che il carico di lavoro del reparto Marketing sia isolato dalle richieste di CPU del carico di lavoro dell'altro reparto. La percentuale di CPU massima è un valore massimo opportunistico. Se disponibile, il thread di lavoro utilizza fino al 100% della capacità della CPU. Il valore massimo viene applicato solo in caso di contesa delle risorse della CPU. In questo esempio, se il carico di lavoro del reparto Vendita è disattivato, per il carico di lavoro del reparto Marketing se necessario può essere utilizzato il 100% della CPU.
CAP_CPU_PERCENT
L'impostazione CAP_CPU_PERCENT impone un limite rigido sulla larghezza di banda della CPU per tutte le richieste nel pool di risorse. I carichi di lavoro associati al pool possono utilizzare la capacità della CPU oltre il valore di MAX_CPU_PERCENT se è disponibile, ma non oltre il valore di CAP_CPU_PERCENT. Utilizzando l'esempio della sezione precedente, supponiamo che al reparto Marketing sia fatturato l'utilizzo delle risorse. Il reparto chiede di ricevere una fatturazione prevedibile e non desidera pagare più del 30 percento della CPU. Questo obiettivo può essere soddisfatto impostando CAP_CPU_PERCENT su 30 per il pool di risorse del reparto Marketing.
MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT
Queste impostazioni rappresentano il valore minimo e massimo della quantità di memoria riservata al pool di risorse che non può essere condivisa con altri pool di risorse. Per i database senza tabelle ottimizzate per la memoria, la memoria a cui viene fatto riferimento è la memoria concessa per l'esecuzione delle query, non la memoria del pool di buffer (le pagine di dati e di indice). Per altre informazioni sulle concessioni di memoria di esecuzione delle query, vedi Considerazioni sulle concessioni di memoria. Impostando un valore di memoria minimo per un pool, si garantisce la disponibilità della percentuale di memoria specificata per qualsiasi richiesta eseguita nel pool di risorse. Questa impostazione è diversa rispetto a MIN_CPU_PERCENT, perché in questo caso la memoria può rimanere nel pool di risorse in questione anche se non esistono richieste nei gruppi di carico di lavoro appartenenti a esso. Occorre quindi prestare molta attenzione durante l'utilizzo di questa impostazione, perché la memoria specificata non è disponibile per gli altri pool, anche in assenza di richieste attive. Se si imposta un valore di memoria massimo per un pool, significa che le richieste in esecuzione in questo pool non ottengono mai più di questa percentuale di memoria complessiva.
Per gestire la memoria per le tabelle ottimizzate per la memoria con Resource Governor, è necessario associare il database a un pool di risorse distinto. Per altre informazioni, vedere Associare un database con tabelle con ottimizzazione per la memoria a un pool di risorse.
AFFINITY
Con questa impostazione è possibile impostare l'affinità di un pool di risorse a una o più unità di pianificazione o nodi NUMA per un maggiore isolamento delle risorse della CPU. Per utilizzare lo scenario dei reparti Vendita e Marketing della sezione precedente, supponiamo che il reparto Vendita necessiti di un ambiente più isolato e richieda costantemente il 100% di un core CPU. Tramite l'utilizzo dell'opzione AFFINITY è possibile pianificare i carichi di lavoro dei reparti Vendita e Marketing su CPU differenti. Supponendo che il valore di CAP_CPU_PERCENT nel pool del reparto Marketing sia invariato, il carico di lavoro del reparto Marketing continua a utilizzare un massimo del 30 percento di un core, mentre il carico di lavoro del reparto Vendita utilizza il 100 percento dell'altro core. Per quanto concerne i carichi di lavoro dei reparti Vendita e Marketing, sono in esecuzione su due computer isolati.
MIN_IOPS_PER_VOLUME e MAX_IOPS_PER_VOLUME
Queste impostazioni rappresentano il valore minimo e massimo delle operazioni di I/O fisico al secondo (IOPS) per volume di disco per un pool di risorse. È possibile utilizzare queste impostazioni per controllare gli I/O fisici per i thread di utente per un determinato pool di risorse. Il reparto Vendita genera ad esempio numerosi report di fine mese in grandi batch. Le query in questi batch possono generare operazioni di I/O tali da saturare il volume del disco e influire sulle prestazioni di altri carichi di lavoro nel database che hanno una priorità più elevata. Per isolare questo carico di lavoro, MIN_IOPS_PER_VOLUME viene impostato su 20 e MAX_IOPS_PER_VOLUME viene impostato su 100 per il pool di risorse del reparto Vendita. Queste impostazioni controllano il livello di operazioni di I/O che possono essere rilasciate per il carico di lavoro.
Pool di risorse definiti dall'utente e dal sistema
In Resource Governor sono disponibili due pool di risorse, il pool interno e il pool predefinito. È possibile creare altri pool.
Pool interno
Il pool interno rappresenta le risorse consumate dallo stesso SQL Server. Questo pool contiene sempre soltanto il gruppo interno e non può essere modificato in alcun modo. Il consumo delle risorse da parte del pool interno non è limitato. Tutti i carichi di lavoro nel pool sono considerati critici per la funzione del server. Pertanto, Resource Governor consente al pool interno di richiedere memoria agli altri pool anche se questo comporta la violazione dei limiti impostati per gli altri pool.
Nota
L'utilizzo del pool interno e delle risorse del gruppo interno non viene sottratto dall'utilizzo complessivo delle risorse. Le percentuali vengono calcolate dalle risorse complessive disponibili.
Pool predefinito
Il pool predefinito è il primo pool utente predefinito. Prima della configurazione il pool predefinito contiene solo il gruppo predefinito. Non è possibile creare o eliminare il pool predefinito, ma è possibile modificarlo. Il pool predefinito può contenere gruppi definiti dall'utente oltre al gruppo predefinito. A partire da SQL Server 2016 (13.x), sono presenti un pool di risorse predefinito per le operazioni di routine di SQL Server e un pool di risorse esterno predefinito per i processi esterni, ad esempio l'esecuzione di script R.
Nota
Il gruppo predefinito può essere modificato ma non può essere spostato all'esterno del pool predefinito.
Pool esterno
Gli utenti possono creare un pool esterno per definire le risorse per i processi esterni. Per R Services, questo pool si occupa di gestire rterm.exe
, BxlServer.exe
, python.exe
e altri processi da essi generati. Per altre informazioni, vedi CREATE EXTERNAL RESOURCE POOL.
Pool di risorse definiti dall'utente
I pool di risorse definiti dall'utente sono quelli che si creano per carichi di lavoro specifici in un ambiente. Resource Governor fornisce istruzioni DDL per la creazione, la modifica e l'eliminazione dei pool di risorse. Per altre informazioni, vedi Creare un pool di risorse, Eliminare un pool di risorse e Modificare le impostazioni del pool di risorse.
Assegnazione delle risorse tra pool
Quando si configurano la CPU o la memoria, la somma dei valori MIN di tutti i pool non può superare il 100 percento delle risorse del server. Inoltre, quando si configura la CPU o la memoria, i valori MAX e CAP possono essere impostati dovunque nell'intervallo tra MIN e 100 percento inclusi.
Se per un pool è definito un valore MIN diverso da zero, il valore MAX effettivo degli altri pool viene nuovamente regolato. Il valore minimo del valore MAX configurato di un pool e la somma dei valori MIN degli altri pool vengono sottratti dal 100 percento.
Nella seguente tabella vengono illustrati alcuni concetti precedenti. Nella tabella vengono mostrate le impostazioni per il pool interno, il pool predefinito e due pool definiti dall'utente.
Nome pool | Impostazione MIN% | Impostazione MAX% | Valore MAX% effettivo calcolato | Percentuale condivisa calcolata | Commento |
---|---|---|---|---|---|
internal | 0 | 100 | 100 | 0 | I valori MAX% effettivo e la percentuale condivisa non sono applicabili al pool interno. |
impostazione predefinita | 0 | 100 | 30 | 30 | Il valore MAX effettivo viene calcolato come: min(100,100-(20+50)) = 30. La percentuale condivisa calcolata è il valore effettivo MAX - MIN = 30. |
Pool 1 | 20 | 100 | 50 | 30 | Il valore MAX effettivo viene calcolato come: min(100,100-50) = 50. La percentuale condivisa calcolata è il valore effettivo MAX - MIN = 30. |
Pool 2 | 50 | 70 | 70 | 20 | Il valore MAX effettivo viene calcolato come: min(70,100-20) = 70. La percentuale condivisa calcolata è il valore effettivo MAX - MIN = 20. |
Le seguenti formule vengono utilizzate per calcolare il valore MAX% effettivo e la percentuale condivisa nella tabella:
Min(X,Y) indica il valore più piccolo di X e Y.
Sum(X) indica la somma del valore X in tutti i pool.
Totale percentuale condivisa = 100 - sum(MIN%).
Valore effettivo MAX% = Min(X,Y).
Percentuale condivisa = Valore effettivo MAX% - MIN%.
Utilizzando la tabella precedente come esempio, è possibile descrivere ulteriormente le regolazioni che si verificano quando viene creato un altro pool. Il pool descritto è il pool 3 e ha una impostazione MIN% di 5.
Nome pool | Impostazione MIN% | Impostazione MAX% | Valore MAX% effettivo calcolato | Percentuale condivisa calcolata | Commento |
---|---|---|---|---|---|
internal | 0 | 100 | 100 | 0 | I valori MAX% effettivo e la percentuale condivisa non sono applicabili al pool interno. |
impostazione predefinita | 0 | 100 | 25 | 25 | Il valore MAX effettivo viene calcolato come: min(100,100-(20+50+5) = 25. La percentuale condivisa calcolata è il valore effettivo MAX - MIN = 25. |
Pool 1 | 20 | 100 | 45 | 25 | Il valore MAX effettivo viene calcolato come: min(100,100-55) = 45. La percentuale condivisa calcolata è il valore effettivo MAX - MIN = 25. |
Pool 2 | 50 | 70 | 70 | 20 | Il valore MAX effettivo viene calcolato come: min(70,100-25) = 70. La percentuale condivisa calcolata è il valore effettivo MAX - MIN = 20. |
Pool 3 | 5 | 100 | 30 | 25 | Il valore MAX effettivo viene calcolato come: min(100,100-70) = 30. La percentuale condivisa calcolata è il valore effettivo MAX - MIN = 25. |
La parte condivisa del pool viene utilizzata per indicare la destinazione possibile delle risorse, se disponibili. Tuttavia, quando le risorse vengono consumate, vengono destinate al pool specificato e non vengono condivise. Questo comportamento può migliorare l'utilizzo delle risorse nei casi in cui non sono presenti richieste in un pool specificato e le risorse configurate per il pool possono essere liberate per gli altri pool.
Alcuni casi estremi di configurazione del pool sono:
Tutti i pool definiscono valori minimi che in totale rappresentano il 100 percento delle risorse del server. In questo caso i valori massimi effettivi equivalgono ai minimi. Ciò equivale a dividere le risorse del server in parti non sovrapposte indipendentemente dalle risorse utilizzate in ciascun pool.
Tutti i pool hanno valori minimi uguali a zero. Tutti i pool si contendono le risorse disponibili e le dimensioni finali sono basate sull'utilizzo delle risorse in ciascun pool. Altri fattori quali i criteri svolgono un ruolo nella determinazione delle dimensioni finali del pool.
Attività relative ai pool di risorse
Descrizione dell'attività | Articolo |
---|---|
Viene descritto come creare un pool di risorse. | Creare un pool di risorse |
Viene descritto come modificare le impostazioni del pool di risorse. | Modificare le impostazioni del pool di risorse |
Viene descritto come eliminare un pool di risorse. | Eliminare un pool di risorse |