Risoluzione dei problemi relativi a Resource Governor

In questo argomento vengono fornite istruzioni per la risoluzione dei problemi relativi a condizioni che possono verificarsi durante l'utilizzo di Resource Governor. Tali istruzioni sono organizzate nelle categorie seguenti:

  • Errori

  • Risultati imprevisti

  • Errori e problemi relativi alle prestazioni

Errori di Resource Governor

I messaggi di errore di Resource Governor includono tutte le azioni relative alla configurazione e all'utilizzo di Resource Governor.

Nella tabella seguente vengono forniti esempi di messaggi di errore di Resource Governor nonché istruzioni sulle modalità di risoluzione del problema descritto nel messaggio di errore.

Numero di errore

Messaggio di errore

Soluzione

8645

Timeout durante l'attesa di risorse di memoria per l'esecuzione della query nel pool di risorse 'myTestPool' (257). Eseguire nuovamente la query.

Configurare un valore di timeout più elevato o ridurre il carico della query nel server.

8651

Impossibile eseguire l'operazione. Concessione di memoria richiesta non disponibile nel pool di risorse 'myTestPool' (257). Rieseguire la query, ridurre il carico della query o controllare l'impostazione di configurazione di Resource Governor.

Rieseguire la query in un momento successivo. Ridurre il carico della query nel server. Rivolgersi all'amministratore per verificare l'impostazione di configurazione di Resource Governor.

8657

Impossibile ottenere la concessione di memoria di 1024 KB perché supera il limite di configurazione massimo nel gruppo del carico di lavoro 'myTestGroup' (267) e nel pool di risorse 'myTestPool' (257). Per aumentare il limite di utilizzo della memoria, rivolgersi all'amministratore del server.

Riscrivere la query per ridurre le operazioni che utilizzano memoria, ad esempio operazioni di ordinamento e hash join. Chiedere all'amministratore di sistema di aumentare il limite di utilizzo della memoria.

Un amministratore può regolare uno o entrambi i parametri seguenti:

  • max_memory_percent nei pool di risorse, che imposta lo spazio massimo di concessione di memoria fisica per tutte le query.

  • request_max_memory_grant_percent nei gruppi del carico di lavoro, che imposta il limite per query.

Un amministratore può ottenere il limite fisico effettivo dalla colonna max_target_memory_kb tramite sys.dm_exec_query_resource_semaphores.

Il limite per query può essere calcolato da max_target_memory_kb * request_max_memory_grant_percent.

NotaNota
È necessario che l'amministratore verifichi che la memoria richiesta dichiarata nel messaggio di errore sia minore del limite per query calcolato in precedenza. È importante notare tuttavia che l'aumento di request_max_memory_grant_percent provoca come effetto collaterale la riduzione della concorrenza di query di grandi dimensioni. Gli utenti possono prevedere ad esempio di eseguire tre query di grandi dimensioni con l'impostazione predefinita 25%, ma solo due query di grandi dimensioni con un'impostazione del 40%.

10900

Impossibile configurare Resource Governor all'avvio. Controllare il log degli errori di SQL Server per informazioni su messaggi di errore specifici o controllare la consistenza del database master eseguendo DBCC CHECKCATALOG('master').

Provare a eseguire "DBCC CHECKCATALOG('master')".

10901

L'utente non dispone delle autorizzazioni necessarie per modificare la configurazione di Resource Governor.

Concedere le autorizzazioni che consentono di modificare la configurazione di Resource Governor e riprovare.

10902

La funzione definita dall'utente 'dbo.rgclassifier_v1' non esiste nel database master o l'utente non dispone delle autorizzazioni necessarie per accedervi.

Creare una funzione di classificazione definita dall'utente in master o concedere le autorizzazioni necessarie per la funzione di classificazione definita dall'utente esistente.

10903

Il nome di schema specificato 'dbo' per la funzione di classificazione definita dall'utente non esiste o l'utente non dispone delle autorizzazioni necessarie per utilizzarlo.

Provare un altro nome di schema o ottenere le autorizzazioni corrette per questo schema.

10904

Configurazione di Resource Governor non riuscita. Sono presenti sessioni attive nei gruppi del carico di lavoro da eliminare o da spostare in altri pool di risorse. Disconnettere tutte le sessioni attive nei gruppi del carico di lavoro in questione e riprovare.

Disconnettere tutte le sessioni attive nei gruppi in questione e riprovare.

NotaNota
In questa versione di Resource Governor non è possibile spostare i gruppi tra pool quando sono presenti sessioni aperte nei gruppi stessi.

10905

Impossibile completare la configurazione di Resource Governor. Memoria insufficiente. Ridurre il carico del server o ripetere l'operazione in una connessione amministrativa dedicata.

Ridurre il carico nel server o provare a eseguire un'operazione di configurazione in una connessione amministrativa dedicata.

10906

L'oggetto 'dbo'.'rgclassifier_v1' non è una funzione di classificazione definita dall'utente di Resource Governor valida. Affinché sia valida, una funzione di classificazione definita dall'utente deve essere associata a schema, restituire sysname ed essere priva di parametri.

Specificare una funzione di classificazione definita dall'utente valida. Una funzione di classificazione definita dall'utente valida deve soddisfare le condizioni seguenti:

  • Restituire sysname.

  • Essere priva di parametri.

  • Essere creata con l'opzione SCHEMABINDING.

10907

Attributo 'MIN_CPU_PERCENT' con valore 50 maggiore dell'attributo 'MAX_CPU_PERCENT' con valore 40.

Specificare un valore minimo minore o uguale al valore massimo.

10908

Attributo 'MAX_MEMORY_PERCENT' con valore 40 minore dell'attributo 'MIN_MEMORY_PERCENT' con valore 60.

Specificare un valore massimo maggiore o uguale al valore dell'attributo minimo.

10909

Impossibile creare il pool di risorse. Il numero massimo di pool di risorse, inclusi i pool di risorse predefiniti, non può superare il limite corrente di %u.

Eliminare i pool di risorse non necessari.

10910

Impossibile completare l'operazione. A causa del valore di 'MIN_CPU_PERCENT' specificato, 25, la somma dei valori minimi in tutti i pool di risorse supera il 100 percento. Ridurre il valore o modificare altri pool di risorse affinché la somma sia minore di 100.

Ridurre il valore relativo a MIN_CPU_PERCENT.

10911

Impossibile eseguire l'operazione richiesta perché il pool di risorse 'myTestPool2' non esiste.

Eseguire una query sulla vista del catalogo sys.resource_governor_resource_pools per visualizzare i pool di risorse attualmente definiti. Scegliere un pool esistente o creare un nuovo pool.

10912

Impossibile completare l'operazione. Eliminazione del gruppo del carico di lavoro predefinito non consentita.

Scegliere un gruppo del carico di lavoro creato dall'utente da eliminare.

10913

Non è consentito eliminare il gruppo del carico di lavoro 'internal' nel pool di risorse 'internal'.

Creare il gruppo del carico di lavoro in un pool creato dall'utente o nel pool predefinito.

10914

Il nome del gruppo del carico di lavoro '#mygroup' non può iniziare con # di ##.

Non utilizzare # o ## quando si crea un gruppo oppure un pool.

10915

Impossibile completare l'operazione. Modifica del gruppo del carico di lavoro 'internal' non consentita.

Scegliere un pool oppure un gruppo creato dall'utente da modificare.

Nota   La modifica della configurazione del gruppo o del pool di risorse predefinito è consentita.

10916

Impossibile eliminare il pool di risorse 'myTestPool' perché contiene il gruppo del carico di lavoro 'myTestGroup'. Prima di eliminare il pool di risorse, eliminare o rimuovere tutti i gruppi del carico di lavoro che lo utilizzano.

Eliminare o spostare tutti i gruppi del carico di lavoro che utilizzano il pool, quindi eliminarlo.

10917

Istruzione ALTER WORKLOAD GROUP non riuscita. Specificare una clausola 'WITH' o 'USING'.

Utilizzare la clausola 'WITH' oppure 'USING' nell'istruzione ALTER WORKLOAD GROUP.

10918

Impossibile creare il pool di risorse 'myTestPool' perché esiste già.

Scegliere un nome del pool di risorse diverso.

10919

Errore durante la lettura della configurazione di Resource Governor dal database master. Controllare l'integrità del database master o rivolgersi all'amministratore di sistema.

Provare a eseguire "DBCC CHECKCATALOG('master')".

10920

Impossibile eliminare la funzione definita dall'utente 'dbo.myclassifer', perché è in uso come funzione di classificazione di Resource Governor.

Nessuno.

10921

Impossibile spostare il gruppo del carico di lavoro 'default' all'esterno del pool di risorse 'default'.

Non applicabile.

10981

Riconfigurazione di Resource Governor completata.

Questo messaggio viene scritto nel log eventi di SQL Server.

10982

Impossibile eseguire la funzione di classificazione definita dall'utente di Resource Governor. Per ulteriori informazioni, vedere gli errori precedenti nel log degli errori di SQL Server dall'ID di sessione 58. Tempo classificazione trascorso: 800 ms.

Questo messaggio viene scritto nel log degli errori di SQL Server.

Nota   I messaggi precedenti nel log degli errori di SQL Server con lo stesso identificatore di processo del server (SPID) possono indicare cause dell'errore specifiche. Una funzione di classificazione con esecuzione prolungata può provocare il timeout dell'accesso utente. Verificare se il tempo trascorso relativo alla funzione di classificazione supera il timeout di accesso client.

10983

Riconfigurazione di Resource Governor annullata dall'utente.

Non applicabile.

10984

Riconfigurazione di Resource Governor non riuscita.

Non applicabile.

Risultati imprevisti

In alcune situazioni i vari elementi di Resource Governor funzionano in modo corretto, ma i risultati non sono quelli previsti. È possibile ad esempio che la classificazione della sessione sembri non funzionare in modo corretto o che siano presenti problemi associati all'eliminazione o alla creazione di gruppi del carico di lavoro.

Classificazione della sessione

Le sessioni verranno assegnate al gruppo del carico di lavoro predefinito quando si verificano le condizioni seguenti:

  • La funzione di classificazione definita dall'utente non esiste o non è abilitata.

  • La funzione di classificazione definita dall'utente ha inserito le sessioni nel gruppo del carico di lavoro predefinito. Questa situazione indica un errore nella logica della funzione.

Operazioni di base per la risoluzione dei problemi

Se non è disponibile alcuna funzione di classificazione definita dall'utente, tutte le sessioni verranno assegnate automaticamente al gruppo del carico di lavoro predefinito. Dopo avere creato una funzione di classificazione definita dall'utente, è necessario verificare che sia registrata con Resource Governor e che la configurazione in memoria sia aggiornata.

La creazione, la registrazione e l'abilitazione di una funzione di classificazione definita dall'utente vengono completate in tre passaggi:

  • Creazione della funzione.

    CREATE FUNCTION function_name() RETURNS <something> 
    WITH SCHEMABINDING
    
  • Registrazione della funzione con Resource Governor.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=schema_name.function_name)
    
  • Aggiornamento della configurazione in memoria di Resource Governor.

    ALTER RESOURCE GOVERNOR RECONFIGURE
    

La prima operazione da eseguire durante la risoluzione dei problemi relativi alla classificazione consiste nel verificare che la funzione creata sia registrata con Resource Governor e che la configurazione sia stata aggiornata. Per ottenere il nome dello schema (schema_name) e il nome dalla funzione di classificazione (function_name) per la funzione di classificazione definita dall'utente attualmente utilizzata da Resource Governor, utilizzare la query seguente.

USE master
SELECT 
      object_schema_name(classifier_function_id) AS [schema_name],
      object_name(classifier_function_id) AS [function_name]
FROM sys.dm_resource_governor_configuration

È possibile utilizzare l'approccio precedente per risolvere i problemi relativi a uno scenario in cui è stata modificata la funzione di classificazione definita dall'utente, ma in cui Resource Governor utilizza ancora la logica della funzione precedente per classificare le sessioni. Questo comportamento indica che le modifiche apportate non sono state applicate alla configurazione in memoria.

Operazioni avanzate per la risoluzione dei problemi

È possibile creare una funzione di classificazione molto complessa che non produce i risultati previsti o che utilizza un numero elevato di risorse. Se sono state eseguite le operazioni di base per la risoluzione dei problemi, è necessario verificare che la logica della funzione sia valida. Nello scenario peggiore è possibile che un errore presente nel codice provochi un ciclo infinito oppure una query runaway.

Per risolvere i problemi relativi a una funzione di classificazione scritta in modo non corretto, è possibile utilizzare una connessione amministrativa dedicata (DAC, Dedicated Administrator Connection) che non è soggetta alla classificazione e può essere utilizzata mentre Resource Governor è in esecuzione e classifica le sessioni in ingresso. Per ulteriori informazioni, vedere Utilizzo di una connessione amministrativa dedicata.

[!NOTA]

Se per la risoluzione dei problemi non è disponibile alcuna connessione amministrativa dedicata, è possibile riavviare il sistema in modalità utente singolo. Sebbene tale modalità non sia soggetta alla classificazione, non consente di eseguire la diagnosi della classificazione di Resource Governor mentre è in esecuzione.

Per ottenere informazioni sulla funzione di classificazione, eseguire una query sugli elementi seguenti:

  • sys.dm_exec_query_stats (contiene informazioni sull'istruzione, ma non la funzione effettiva)

  • sys.dm_exec_sql_text (da utilizzare con sql_handle ottenuto da sys.dm_exec_query_stats)

  • classe di evento PreConnect:Starting (indica ID e nome della funzione di classificazione)

Errori di riconfigurazione

In Resource Governor le modifiche apportate ai metadati vengono tenute separate dalle sessioni in esecuzione fino a quando l'istruzione ALTER RESOURCE GOVERNOR RECONFIGURE non è completata. L'istruzione ALTER RESOURCE GOVERNOR RECONFIGURE non verrà eseguita se si tenta di eliminare un gruppo che contiene sessioni attive o aperte oppure se si tenta di eliminare un pool di risorse in cui sono contenuti gruppi del carico di lavoro.

Per ottenere la configurazione in memoria e archiviata, eseguire rispettivamente una query su sys.dm_resource_governor_configuration e sys.resource_governor_configuration: Il valore 1 per is_reconfiguration_pending (sys.dm_resource_governor_configuration) indica che la configurazione della sessione non è stata aggiornata. In questo caso, effettuare una delle operazioni seguenti:

  • Attendere il completamento delle sessioni o l'eliminazione delle relative connessioni.

  • Interrompere la sessione attiva o eliminarne la connessione in modo esplicito.

  • Ricreare il gruppo oppure il pool eliminato, regolarne le impostazioni e rieseguire ALTER RESOURCE GOVERNOR RECONFIGURE.

Errori e problemi relativi alle prestazioni

Se durante l'utilizzo di Resource Governor si verificano problemi relativi alle prestazioni, è necessario stabilire se il problema è provocato dalla configurazione di Resource Governor. Le istruzioni per la risoluzione dei problemi disponibili in questa sezione sono raggruppate in due categorie:

  • Classificazione della sessione

  • Esecuzione della query

Classificazione della sessione

Un trigger LOGON o una funzione di classificazione definita dall'utente con esecuzione prolungata può influire sulle prestazioni del server. Se la quantità di tempo necessaria per il completamento del trigger LOGON o della funzione di classificazione definita dall'utente è elevata, si verificherà un timeout della connessione, ma il trigger o la funzione continuerà a essere in esecuzione e a utilizzare risorse del server.

Se si ritiene che siano in esecuzione sessioni in uno stato di pre-connessione, eseguire l'accesso utilizzando una connessione amministrativa dedicata e verificare la Classe di evento PreConnect:Starting per stabilire se siano presenti più richieste o sessioni avviate, ma non completate.

Per risolvere questo problema ed evitare che si verifichi nuovamente, eseguire le operazioni seguenti:

  • Interrompere le sessioni

  • Identificare le cause probabili relative alla presenza di un trigger LOGON o di una funzione con esecuzione prolungata

  • Rimuovere e sostituire il trigger o la funzione che provoca il problema

Esecuzione della query

Dopo che è stata classificata e mentre è in esecuzione, una query potrebbe non rispondere, ovvero bloccarsi, oppure avere esito negativo. Se si ritiene che le impostazioni correnti di Resource Governor siano la causa, è necessario esaminare gli aspetti seguenti della configurazione di Resource Governor:

  • Limitazione del numero di richieste

  • Limite massimo della CPU

  • Limitazione della larghezza di banda della CPU

  • Dimensioni della concessione di memoria

  • Errore di timeout delle concessioni di memoria

  • Errore di memoria insufficiente

  • Piano di query non ottimale

Limitazione del numero di richieste

In questo scenario un utente segnala una riduzione delle prestazioni e si ritiene che il numero di richieste sia limitato.

La prima operazione da eseguire consiste nel verificare se la limitazione del numero di richieste è configurata in modo esplicito per il gruppo cui l'utente appartiene. A tale scopo, verificare a quale gruppo appartiene l'utente per esaminare se l'impostazione GROUP_MAX_REQUESTS è abilitata. Se GROUP_MAX_REQUESTS non è abilitata, non è presente alcuna limitazione del numero di richieste esplicita ed è necessario effettuare le operazioni seguenti per eseguire un'analisi più approfondita.

  • Eseguire una query su sys.dm_os_waiting_tasks per verificare se sono presenti richieste in attesa sul tipo RESMGR_THROTTLED. La presenza di questo tipo di attesa indica una limitazione del numero di richieste.

  • Avviare Performance Monitor e raccogliere i dati utilizzando i contatori Richieste in coda e Richieste attive. Un valore di Richieste in coda diverso da zero indica la limitazione del numero di richieste.

  • Verificare se il valore di Richieste attive corrisponde all'impostazione GROUP_MAX_REQUESTS. Se il valore di Richieste attive è più elevato dell'impostazione GROUP_MAX_REQUESTS, nel gruppo possono essere presenti richieste che non possono essere limitate, ad esempio transazioni aperte.

  • Se il valore di Richieste in coda è uguale a zero, verificare il valore di Richieste attive per tutti i gruppi del carico di lavoro che condividono lo stesso pool di risorse poiché nel pool potrebbe essersi verificato un overload a causa di un numero troppo elevato di richieste.

Limite massimo della CPU

Se si dispone di un criterio basato sulla generazione di eventi di Resource Governor, è possibile utilizzare l'evento generato quando viene raggiunto il limite massimo della CPU.

In questo scenario si desidera determinare se il limite massimo della CPU (REQUEST_MAX_CPU_TIME_SEC) configurato per rilevare una query che utilizza una quantità eccessiva di CPU è troppo basso.

Per convalidare l'impostazione relativa al limite della CPU, effettuare le seguenti operazioni.

  • Avviare una sessione di Traccia SQL e raccogliere l'evento CPU Threshold Exceeded. Quando una richiesta dell'utente raggiunge il limite massimo di utilizzo della CPU, il server genera automaticamente un evento di Traccia SQL. Se il valore impostato è troppo basso, verrà generato un numero elevato di tali eventi.

[!NOTA]

Questo evento viene esposto inoltre come una notifica degli eventi generati dal server in modo che sia possibile creare uno script che reagisce all'evento.

  • Avviare Performance Monitor e raccogliere i dati utilizzando il contatore Tempo massimo CPU richieste (ms). È possibile utilizzare il valore di tale contatore come guida per l'impostazione del limite appropriato per il gruppo del carico di lavoro.

Limitazione della larghezza di banda della CPU

In questo scenario si ritiene che la larghezza di banda della CPU sia limitata perché il valore del contatore delle prestazioni Utilizzo CPU (%) è uguale o vicino a quello dell'impostazione MAX_CPU_PERCENT di Resource Governor. Nella query seguente viene restituito il valore dell'utilizzo della CPU espresso in percentuale per tutti i gruppi del carico di lavoro e i pool di risorse per un'istanza di SQL Server.

select * from sys.dm_os_performance_counters where counter_name = 'cpu usage %'

Per ulteriori informazioni, vedere sys.dm_os_performance_counters (Transact-SQL).

Per determinare se la larghezza di banda della CPU è limitata, effettuare i controlli seguenti nel sistema.

  • Controllare l'utilizzo totale della CPU nel server. Se un carico diverso da quello relativo a SQL Server è attualmente attivo, può influire sulla query di cui è in corso la risoluzione dei problemi.

  • Controllare la distribuzione dell'utilizzo della CPU tra i pool di risorse. Un pool di risorse potrebbe essere limitato perché per un altro pool è stato configurato un valore minimo elevato relativo all'utilizzo della CPU. Confrontare i contatori relativi all'utilizzo della CPU previsto (calcolato) rispetto a quello effettivo.

  • Controllare i gruppi del carico di lavoro assegnati al pool di risorse specifico. Il carico degli altri gruppi del carico di lavoro può influire sugli utenti che condividono lo stesso pool.

  • Controllare la distribuzione dell'utilizzo della CPU tra le utilità di pianificazione. La query che si sta esaminando potrebbe essere posizionata in un'utilità di pianificazione che contiene query con esecuzione prolungata. In questo caso la query può sembrare limitata, mentre il problema effettivo è costituito dalla distribuzione non uniforme del carico tra le utilità di pianificazione.

  • Controllare i possibili casi in cui il carico di lavoro viene bloccato da altre sessioni anziché essere limitato dalle impostazioni di Resource Governor.

  • Controllare il numero di sessioni che eseguono query attualmente nel sistema. Man mano che il numero di richieste di esecuzione simultanee aumenta, in SQL Server verrà eseguito un tentativo per garantire che tutte le richieste ricevano almeno la stessa quantità di tempo di CPU per impedire l'esaurimento delle risorse della CPU stessa.

Dimensioni della concessione di memoria

In questo scenario si ritiene che l'esecuzione di una query sia lenta a causa delle dimensioni della memoria concessa.

In Resource Governor viene applicato il limite di memoria massimo per le query riducendo la memoria concessa in modo che le query di grandi dimensioni rientrino nel limite. Se una query ottiene una concessione di memoria minore del 100%, potrebbe essere necessario eseguire lo spill dei dati temporanei e scriverli sul disco. Questa operazione può influire in modo significativo sulle prestazioni.

È necessario determinare la percentuale di query di grandi dimensioni per impostare il limite massimo delle dimensioni per la query appropriato. Per determinare le impostazioni migliori, eseguire le operazioni seguenti.

  • Eseguire una query su sys.dm_exec_query_memory_grants per verificare lo stato corrente delle concessioni di memoria. La colonna ideal_memory_kb indica la quantità ideale basata sulla cardinalità stimata, mentre la colonna requested_memory_kb indica la quantità richiesta che avrebbe potuto essere ridotta dopo che il limite massimo per la query è stato raggiunto. Se il valore requested_memory_kb è significativamente minore di ideal_memory_kb, lo spill relativo alla query potrebbe essere eseguito di frequente qualora la stima della cardinalità sia corretta.

  • Avviare Performance Monitor e raccogliere i dati utilizzando il contatore Concessioni di memoria ridotte/sec. Il valore di tale contatore rappresenta la frequenza del conteggio delle concessioni che hanno ricevuto una quantità di memoria minore rispetto a quella ideale dopo avere raggiunto il limite massimo delle dimensioni per le richieste. Le query di grandi dimensioni possono essere eseguite più lentamente rispetto a quelle con la quantità ideale poiché per tali query è necessario eseguire lo spill su disco affinché rientrino nei limiti di memoria.

Per risolvere un problema di concessione di memoria, può essere necessario aumentare il limite delle dimensioni del pool o il limite massimo delle dimensioni della memoria.

[!NOTA]

Se si aumentano solo le dimensioni massime della memoria, l'esecuzione simultanea di query di grandi dimensioni potrebbe subire una riduzione.

Errore di timeout delle concessioni di memoria

In questo scenario una query ha esito negativo e provoca un errore di timeout delle concessioni di memoria.

Sia il numero complessivo di richieste di concessione di memoria attive che i limiti della memoria specificati nelle definizioni dei gruppi del carico di lavoro e dei pool di risorse possono svolgere un ruolo nei timeout delle concessioni di memoria. Se un unico pool di risorse è condiviso da più gruppi di risorse, anche il numero di query simultanee in altri gruppi può influire sui timeout delle concessioni di memoria.

Per determinare le impostazioni migliori per il pool di risorse, eseguire le operazioni seguenti.

  • Eseguire una query su sys.dm_exec_query_memory_grants per verificare il numero di concessioni di memoria e delle query in attesa sul gruppo e sul pool specifico.

  • Eseguire una query su sys.dm_exec_query_resource_semaphores per verificare la memoria concessa totale e le destinazioni.

Se l'utilizzo della memoria concessa è maggiore dello spazio di memoria disponibile, è possibile aumentare il limite delle dimensioni del pool di risorse.

Errori di memoria insufficiente

Una query ha esito negativo e provoca un errore memoria insufficiente.

Operazioni di base per la risoluzione dei problemi

Per determinare le impostazioni migliori per il gruppo del carico di lavoro, eseguire le operazioni seguenti.

  • Eseguire una query su sys.dm_os_memory_brokers per controllare la distribuzione e la tendenza relative della memoria all'interno del pool di risorse. Un numero eccessivo di richieste in uno spazio di memoria troppo ridotto può provocare un overload nel gruppo del carico di lavoro o nel pool di risorse ed errori di memoria insufficiente.

  • Avviare Performance Monitor e raccogliere i dati utilizzando i contatori del pool di risorse correlati alla memoria per ottenere l'utilizzo della memoria corrente e di destinazione per le concessioni di memoria, la memoria disponibile nella cache e la memoria per la compilazione e di Query Optimizer. Se i valori correnti sono maggiori dei valori di destinazione, nel pool di risorse si è verificato un overload. È consigliabile modificare i limiti di memoria del pool.

  • Avviare Performance Monitor e raccogliere i dati utilizzando il contatore Concessione di memoria massima per le richieste (KB). Se il valore del contatore supera il valore determinato dall'impostazione REQUEST_MAX_MEMORY_GRANT_PERCENT nel gruppo del carico di lavoro, la query probabilmente avrà esito negativo. È consigliabile modificare il limite del gruppo del carico di lavoro.

Operazioni avanzate per la risoluzione dei problemi

L'errore di memoria insufficiente (701) è un errore generico restituito quando le attività tentano di allocare un blocco di memoria dal gestore della memoria e il tentativo non ha esito positivo. Per ulteriori informazioni, vedere MSSQLSERVER_701.

Questo errore può essere causato da una delle seguenti condizioni:

  • Il pool di memoria ha raggiunto il limite totale.

[!NOTA]

Resource Governor può non essere l'unica causa di questa condizione. Potrebbero essere presenti infatti altre applicazioni in esecuzione nel server le cui richieste di memoria contribuiscono al verificarsi di tale condizione.

  • L'allocazione dello spazio di più pagine o degli indirizzi virtuali ha esito negativo poiché nello spazio degli indirizzi virtuali non è disponibile un blocco libero di dimensioni sufficienti per la prenotazione richiesta. Questa situazione può verificarsi con maggiore probabilità in un'architettura a 32 bit rispetto a un'architettura a 64 bit.

  • L'allocazione dello spazio di più pagine o degli indirizzi virtuali ha esito negativo poiché la memoria impegnata totale raggiunge il limite relativo. Questa situazione si verifica sia in architetture a 32 bit che in quelle a 64 bit.

Quando si verifica un errore di memoria insufficiente, il log degli errori costituisce il punto iniziale migliore per esaminare l'errore. Nel log è contenuto un output analogo all'esempio seguente:

2006-01-28 04:27:15.43 spid51 Failed allocate pages: FAIL_PAGE_ALLOCATION 1

I possibili errori registrati nel log relativo sono i seguenti:

  • FAIL_PAGE_ALLOCATION seguito dal numero di pagine che si è tentato di allocare

  • FAIL_VIRTUAL_RESERVE seguito dal numero di byte che si è tentato di riservare

  • FAIL_VIRTUAL_COMMIT seguito dal numero di byte per cui che si è tentato di eseguire il commit

È importante comprendere che l'attività che ha generato l'errore di memoria insufficiente spesso non è quella che ha provocato l'errore. A meno che non sia presente un'attività runaway, la condizione di memoria insufficiente è in genere il risultato di più attività in esecuzione. Di conseguenza, nel caso molto comune di un errore FAIL_PAGE_ALLOCATION, è necessario esaminare un'ampia gamma di attività del sistema.

L'informazione importante successiva nel log degli errori è rappresentata dall'output di stato della memoria. A seconda dell'errore, è necessario eseguire la ricerca dei numeri di pagine singole, di più pagine, riservati o di cui è stato eseguito il commit virtualmente per i clerk di memoria singoli. L'identificazione degli elementi che utilizzano la quantità maggiore di memoria costituisce un passaggio chiave per continuare a esaminare l'errore. In genere, i tipi degli elementi che utilizzano la quantità maggiore di memoria sono i seguenti:

  • MEMORYCLERK_* indica che per la configurazione del server o per il carico di lavoro è necessaria un'allocazione di memoria specifica. Per i componenti di SQL Server sono presenti clerk di memoria corrispondenti, mentre a componenti singoli possono essere associati più clerk di memoria. Per ulteriori informazioni, vedere sys.dm_os_memory_clerks (Transact-SQL). È possibile talvolta identificare il carico di lavoro che provoca il problema tramite i clerk di memoria, ma è più probabile che si desideri esaminare gli oggetti di memoria associati ai clerk per stabilire la causa dell'elevato utilizzo della memoria stessa.

  • CACHESTORE_*, USERSTORE_*, OBJECTSTORE_* sono i tipi di cache. Un utilizzo elevato della memoria elevato da parte di una cache può indicare una delle situazioni seguenti:

    • La memoria è allocata all'esterno della cache, ma non è ancora stata inserita come una voce che può essere eliminata. Questa situazione è molto simile al caso MEMORYCLERK precedente.

    • Tutte le voci di cache sono utilizzate e pertanto non è possibile eliminarle. Questa situazione può essere confermata esaminando sys.dm_os_memory_cache_counters e confrontando i valori delle colonne entries_count ed entries_in_use_count.

  • MEMORYCLERK_SQLQERESERVATIONS indica la quantità di memoria riservata dall'esecuzione della query per eseguire query con operazioni di ordinamento e di join. Un errore di memoria insufficiente che si verifica quando il numero di prenotazioni è elevato indica in genere la presenza di un bug nel server.

L'output di stato della memoria presente nel log degli errori indicherà inoltre il pool di memoria esaurito. I broker di memoria per ogni pool indicano la distribuzione tra la memoria prelevata (compilazione), disponibile nella cache e riservata (concessa). I numeri relativi ai tre broker corrispondono agli oggetti di memoria precedenti associati ai clerk di memoria. Per individuare la quantità di memoria allocata per un pool in base a un clerk oppure a un oggetto di memoria specifico, è possibile estrarre le informazioni da un dump completo utilizzando uno script personalizzato e la vista a gestione dinamica sys.dm_os_memory_cache_entries in cui viene visualizzato il valore pool_id cui ogni voce è associata.

Se è necessario contattare il Servizio Supporto Tecnico Clienti Microsoft, raccogliere le informazioni seguenti da comunicare al personale di supporto:

  • Log degli errori in cui viene segnalato l'errore di memoria insufficiente e l'output di stato della memoria nel momento in cui si è verificato l'errore.

  • Output delle istruzioni seguenti:

    dbcc memorystatus
    dbcc sqlperf(spinlockstats)
    select * from sys.dm_os_memory_clerks
    select * from sys.dm_os_wait_stats order by wait_type
    select * from sys.dm_os_waiting_tasks
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_OOM'
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_RESOURCE_MONITOR'
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_MEMORY_BROKER'
    select * from sys.dm_os_memory_cache_clock_hands
    
  • Dump di memoria insufficiente raccolto con T8004 (facoltativo). A tale minidump saranno associate informazioni importanti, ad esempio il buffer circolare e lo stato di spinlock o di attesa. Il contatore del dump per T8004 può essere reimpostato senza riavviare il server disattivando T8004 e riattivandolo successivamente.

Piano di query non ottimale

In questo scenario si ritiene che l'esecuzione di una query sia lenta a causa di un piano di query non ottimale. Query Optimizer può generare un piano di query non ottimale se la memoria ottenuta non è sufficiente a causa di un'impostazione del limite di memoria su un valore non elevato per un pool di risorse.

Per determinare le impostazioni migliori per il pool di risorse, eseguire le operazioni seguenti.

  • Ottenere dati dal contatore Ottimizzazioni query/sec per verificare se nel gruppo del carico di lavoro è presente un numero elevato di compilazioni di query.

  • Ottenere dati dal contatore Piani non ottimali/sec per verificare se Query Optimizer produce di frequente piani non ottimali.

Se si verifica una delle condizioni precedenti, aumentare il limite di memoria per il pool di risorse.