Risolvere i problemi di memoria insufficienteResolve Out Of Memory issues

In questo argomento si applica a: SìSQL ServernonDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

OLTP in memoria di SQL ServerSQL Server In-Memory OLTP usa più memoria e in modi diversi rispetto a SQL ServerSQL Server. uses more memory and in different ways than does SQL ServerSQL Server. È possibile che la quantità di memoria installata e allocata per OLTP in memoriaIn-Memory OLTP diventi inadeguata con l'aumentare delle esigenze.It is possible that the amount of memory you installed and allocated for OLTP in memoriaIn-Memory OLTP becomes inadequate for your growing needs. In tal caso, è possibile che la memoria risulti insufficiente.If so, you could run out of memory. In questo argomento viene descritto come risolvere una situazione di memoria insufficiente.This topic covers how to recover from an OOM situation. Per le linee guida che consentono di evitare molte situazioni di memoria insufficiente, vedere Monitorare e risolvere i problemi relativi all'utilizzo della memoria .See Monitor and Troubleshoot Memory Usage for guidance that can help you avoid many OOM situations.

Sezioni dell'argomentoCovered in this topic

ArgomentoTopic PanoramicaOverview
Risoluzione degli errori di ripristino del database dovuti a memoria insufficienteResolve database restore failures due to OOM Operazioni da eseguire se viene visualizzato il messaggio di errore "Operazione di ripristino non riuscita per il database '<NomeDatabase>'. Memoria insufficiente nel pool di risorse '<NomePoolRisorse>'."What to do if you get the error message, “Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'.”
Risoluzione dell'impatto delle condizioni di memoria insufficiente sul carico di lavoroResolve impact of low memory or OOM conditions on the workload Operazioni da eseguire nel caso in cui i problemi di memoria insufficiente incidono negativamente sulle prestazioni.What to do if you find low memory issues are negatively impacting performance.
Risoluzione degli errori di allocazione della pagina dovuti a memoria insufficiente quando è disponibile memoria sufficienteResolve page allocation failures due to insufficient memory when sufficient memory is available Operazioni da eseguire se viene visualizzato il messaggio di errore "È in corso la disabilitazione delle allocazioni di pagine per il database '<NomeDatabase>'. Memoria insufficiente nel pool di risorse <NomePoolRisorse>'.What to do if you get the error message, “Disallowing page allocations for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'. …"…” quando è disponibile memoria sufficiente per l'operazione.when available memory is sufficient for the operation.
Procedure consigliate sull'uso di OLTP in memoria in un ambiente di VMBest Practices using In-Memory OLTP in a VM environment Aspetti da tenere presenti quando si usa OLTP in memoria in un ambiente virtualizzato.What to keep in mind when using In-Memory OLTP in a virtualized environment.

Risoluzione degli errori di ripristino del database dovuti a memoria insufficienteResolve database restore failures due to OOM

Quando si prova a ripristinare un database, è possibile che venga visualizzato il messaggio di errore "L'operazione di ripristino non è riuscita per il database '<NomeDatabase>'. Memoria insufficiente nel pool di risorse <NomePoolRisorse>'." Questo errore indica che la memoria disponibile del server non è sufficiente per il ripristino del database.When you attempt to restore a database you may get the error message: “Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'.” This indicates that the server does not have enough available memory for restoring the database.

La memoria disponibile del server in cui viene ripristinato un database deve essere sufficiente per le tabelle ottimizzate per la memoria nel backup del database, in caso contrario il database non verrà portato online.The server you restore a database to must have enough available memory for the memory-optimized tables in the database backup, otherwise the database will not come online.

Se la memoria fisica del server è sufficiente, ma viene comunque visualizzato questo errore, altri processi potrebbero star usando troppa memoria oppure un problema di configurazione rende la memoria disponibile insufficiente per il ripristino.If the server does have enough physical memory, but you are still seeing this error, it could be that other processes are using too much memory or a configuration issue causes not enough memory to be available for restore. Per questo tipo di problemi usare le seguenti misure per aumentare la memoria disponibile per l'operazione di ripristino:For this class of issues, use the following measures to make more memory available to the restore operation:

  • Chiudere temporaneamente le applicazioni in esecuzione.Temporarily close running applications.
    Chiudendo una o più applicazioni in esecuzione o arrestando i servizi non necessari al momento, si libera la memoria usata da tali applicazioni rendendola disponibile per l'operazione di ripristino.By closing one or more running applications or stopping services not needed at the moment, you make the memory they were using available for the restore operation. È possibile riavviarle dopo il completamento del ripristino.You can restart them following the successful restore.

  • Aumentare il valore di MAX_MEMORY_PERCENT.Increase the value of MAX_MEMORY_PERCENT.
    Se il database è associato a un pool di risorse, che rappresenta la procedura consigliata, la memoria disponibile per il ripristino viene regolata da MAX_MEMORY_PERCENT.If the database is bound to a resource pool, which is best practice, the memory available to restore is governed by MAX_MEMORY_PERCENT. Se il valore è troppo basso, il ripristino non riuscirà.If the value is too low, restore will fail. Nel frammento di codice seguente il valore di MAX_MEMORY_PERCENT per il pool di risorse PoolHk viene modificato al 70% della memoria installata.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

    Importante

    Se il server è in esecuzione in una VM e non è dedicato, impostare il valore di MIN_MEMORY_PERCENT sullo stesso valore di MAX_MEMORY_PERCENT.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT to the same value as MAX_MEMORY_PERCENT.
    Per altre informazioni, vedere l'argomento Procedure consigliate sull'uso di OLTP in memoria in un ambiente di VM.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

    -- disable resource governor  
    ALTER RESOURCE GOVERNOR DISABLE  
    
    -- change the value of MAX_MEMORY_PERCENT  
    ALTER RESOURCE POOL PoolHk  
    WITH  
         ( MAX_MEMORY_PERCENT = 70 )  
    GO  
    
    -- reconfigure the Resource Governor  
    --    RECONFIGURE enables resource governor  
    ALTER RESOURCE GOVERNOR RECONFIGURE  
    GO  
    

    Per informazioni sui valori massimi per MAX_MEMORY_PERCENT, vedere la sezione dell'argomento che riporta le percentuali di memoria disponibile per indici e tabelle ottimizzate per la memoria.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

  • Aumentare max server memory.Increase max server memory.
    Per informazioni sulla configurazione di max server memory vedere l'argomento Opzioni di configurazione del server Server Memory.For information on configuring max server memory see the topic Server Memory Server Configuration Options.

Risoluzione dell'impatto delle condizioni di memoria insufficiente sul carico di lavoroResolve impact of low memory or OOM conditions on the workload

Ovviamente, è consigliabile non trovarsi in una situazione di memoria insufficiente.Obviously, it is best to not get into a low memory or OOM (Out of Memory) situation. Una buona pianificazione e un buon monitoraggio consentono di evitare le situazioni di memoria insufficiente.Good planning and monitoring can help avoid OOM situations. Tuttavia, nonostante l'accurata pianificazione non sempre è possibile prevedere le effettive esigenze e potrebbero verificarsi situazioni di memoria insufficiente.Still, the best planning does not always foresee what actually happens and you might end up with low memory or OOM. Sono disponibili due passaggi per risolvere una situazione di memoria insufficiente:There are two steps to recovering from OOM:

  1. Aprire una connessione amministrativa dedicata (DAC)Open a DAC (Dedicated Administrator Connection)

  2. Intraprendere un'azione correttivaTake corrective action

Aprire una connessione amministrativa dedicata (DAC)Open a DAC (Dedicated Administrator Connection)

SQL ServerSQL Server offre una connessione amministrativa dedicata (DAC). provides a dedicated administrator connection (DAC). La connessione DAC consente a un amministratore di accedere a un'istanza in esecuzione del motore di database di SQL Server per risolvere i problemi sul server, anche quando il server non risponde ad altre connessioni client.The DAC allows an administrator to access a running instance of SQL Server Database Engine to troubleshoot problems on the server—even when the server is unresponsive to other client connections. La connessione DAC è disponibile tramite l'utilità sqlcmd e SQL Server Management StudioSQL Server Management Studio.The DAC is available through the sqlcmd utility and SQL Server Management StudioSQL Server Management Studio.

Per informazioni sull'uso della connessione DAC tramite SSMS o sqlcmd, vedere Connessione di diagnostica per gli amministratori di database.For guidance on using DAC through SSMS or sqlcmd, refer to Diagnostic Connection for Database Administrators.

Intraprendere un'azione correttivaTake corrective action

Per risolvere la condizione di memoria insufficiente, è necessario liberare la memoria esistente riducendone l'utilizzo o rendere disponibile una maggiore quantità di memoria per le tabelle in memoria.To resolve your OOM condition you need to either free up existing memory by reducing usage, or make more memory available to your in-memory tables.

Liberare memoria esistenteFree up existing memory

Eliminare le righe non essenziali delle tabelle con ottimizzazione per la memoria e attendere la procedura di Garbage CollectionDelete non-essential memory optimized table rows and wait for garbage collection

È possibile rimuovere le righe non essenziali da una tabella con ottimizzazione per la memoria.You can remove non-essential rows from a memory optimized table. Il Garbage Collector restituisce la memoria usata da queste righe alla memoria disponibile.The garbage collector returns the memory used by these rows to available memory. Il motore OLTP in memoria raccoglie rapidamente le righe di Garbage Collection.In-memory OLTP engine collects garbage rows aggressively. Tuttavia, una transazione con esecuzione prolungata può impedire il processo di Garbage Collection.However, a long running transaction can prevent garbage collection. Ad esempio, se si dispone di una transazione che viene eseguita per 5 minuti, tutte le versioni di riga create a causa delle operazioni di aggiornamento/eliminazione mentre la transazione è attiva non possono essere sottoposte al processo di Garbage Collection.For example, if you have a transaction that runs for 5 minutes, any row versions created due to update/delete operations while the transaction was active can’t be garbage collected.

Spostare una o più righe in una tabella basata su discoMove one or more rows to a disk-based table

Gli articoli di Technet riportati di seguito offrono istruzioni sullo spostamento di righe da una tabella ottimizzata per la memoria a una tabella basata su disco.The following TechNet articles provide guidance on moving rows from a memory-optimized table to a disk-based table.

Aumentare la memoria disponibileIncrease available memory

Aumentare il valore di MAX_MEMORY_PERCENT nel pool di risorseIncrease value of MAX_MEMORY_PERCENT on the resource pool

Se non è stato creato un pool di risorse denominato per le tabelle in memoria, è consigliabile eseguire tale operazione e associare al pool i database di OLTP in memoriaIn-Memory OLTP .If you have not created a named resource pool for your in-memory tables you should do that and bind your OLTP in memoriaIn-Memory OLTP databases to it. Per istruzioni sulla creazione e l'associazione dei database a un pool di risorse, vedere l'argomento Associazione di un database con tabelle con ottimizzazione per la memoria a un pool di risorse OLTP in memoriaIn-Memory OLTP .See the topic Bind a Database with Memory-Optimized Tables to a Resource Pool for guidance on creating and binding your OLTP in memoriaIn-Memory OLTP databases to a resource pool.

Se il database di OLTP in memoriaIn-Memory OLTP è associato a un pool di risorse, è possibile aumentare la percentuale di memoria a cui il pool può accedere.If your OLTP in memoriaIn-Memory OLTP database is bound to a resource pool you may be able to increase the percent of memory the pool can access. Per informazioni sulla modifica del valore di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT per un pool di risorse, vedere l'argomento secondario Cambiare MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT in un pool esistente .See the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool for guidance on changing the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT for a resource pool.

Aumentare il valore di MAX_MEMORY_PERCENT.Increase the value of MAX_MEMORY_PERCENT.
Nel frammento di codice seguente il valore di MAX_MEMORY_PERCENT per il pool di risorse PoolHk viene modificato al 70% della memoria installata.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

Importante

Se il server è in esecuzione in una VM e non è dedicato, impostare il valore di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT sullo stesso valore.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
Per altre informazioni, vedere l'argomento Procedure consigliate sull'uso di OLTP in memoria in un ambiente di VM.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

-- disable resource governor  
ALTER RESOURCE GOVERNOR DISABLE  

-- change the value of MAX_MEMORY_PERCENT  
ALTER RESOURCE POOL PoolHk  
WITH  
     ( MAX_MEMORY_PERCENT = 70 )  
GO  

-- reconfigure the Resource Governor to enabled it
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Per informazioni sui valori massimi per MAX_MEMORY_PERCENT, vedere la sezione dell'argomento che riporta le percentuali di memoria disponibile per indici e tabelle ottimizzate per la memoria.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

Installare memoria aggiuntivaInstall additional memory

Infine, la soluzione migliore, se possibile, prevede l'installazione di ulteriore memoria fisica.Ultimately the best solution, if possible, is to install additional physical memory. In questo caso, tenere presente che probabilmente sarà possibile aumentare anche il valore di MAX_MEMORY_PERCENT (vedere l'argomento secondario Cambiare MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT in un pool esistente) poiché SQL ServerSQL Server potrebbe non richiedere ulteriore memoria, consentendo di rendere disponibile la maggior parte se non tutta la memoria appena installata per il pool di risorse.If you do this, remember that you will probably be able to also increase the value of MAX_MEMORY_PERCENT (see the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool) since SQL ServerSQL Server won’t likely need more memory, allowing you to make most if not all of the newly installed memory available to the resource pool.

Importante

Se il server è in esecuzione in una VM e non è dedicato, impostare il valore di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT sullo stesso valore.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
Per altre informazioni, vedere l'argomento Procedure consigliate sull'uso di OLTP in memoria in un ambiente di VM.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

Risoluzione degli errori di allocazione della pagina dovuti a memoria insufficiente quando è disponibile memoria sufficienteResolve page allocation failures due to insufficient memory when sufficient memory is available

Se viene restituito il messaggio di errore Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'http://go.microsoft.com/fwlink/?LinkId=330673' for more information. nel log degli errori quando la memoria fisica disponibile è sufficiente per allocare la pagina, il problema può essere dovuto a Resource Governor disabilitato.If you get the error message, Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'http://go.microsoft.com/fwlink/?LinkId=330673' for more information. in the error log when the available physical memory is sufficient to allocate the page, it may be due to a disabled Resource Governor. Quando Resource Governor è disabilitato MEMORYBROKER_FOR_RESERVE genera richieste di memoria artificiali.When the Resource Governor is disabled MEMORYBROKER_FOR_RESERVE induces artificial memory pressure.

Per risolvere questo problema, è necessario abilitare Resource Governor.To resolve this you need to enable the Resource Governor.

Per informazioni sui limiti e sulle restrizioni e per istruzioni sull'abilitazione di Resource Governor usando Esplora oggetti, proprietà di Resource Governor o Transact-SQL, vedere Abilitare Resource Governor .See Enable Resource Governor for information on Limits and Restrictions as well as guidance on enabling Resource Governor using Object Explorer, Resource Governor properties, or Transact-SQL.

Procedure consigliate sull'uso di OLTP in memoria in un ambiente di VMBest Practices using In-Memory OLTP in a VM environment

La virtualizzazione del server può aiutare a ridurre i costi operativi e il capitale IT aumentandone l'efficienza grazie a provisioning di applicazioni, manutenzione, disponibilità e processi di backup/recupero migliorati.Server virtualization can help you lower IT capital and operational costs and attain greater IT efficiency with improved application provisioning, maintenance, availability, and backup/recovery processes. Grazie ai recenti progressi tecnologici, ora è possibile consolidare più rapidamente complessi carichi di lavoro del database utilizzando la virtualizzazione.With recent technological advances, complex database workloads can be more readily consolidated using virtualization. Questo argomento illustra le procedure consigliate per l'uso di OLTP in memoria di SQL Server in un ambiente virtualizzato.This topic covers best practices for using SQL Server In-Memory OLTP in a virtualized environment.

Preallocazione di memoriaMemory pre-allocation

Per la memoria in un ambiente virtualizzato, prestazioni e supporto migliorati sono fattori molto importanti.For memory in a virtualized environment, better performance and enhanced support are essential considerations. È necessario essere in grado di allocare rapidamente la memoria alle macchine virtuali a seconda dei requisiti e dei carichi di lavoro nonché di fare in modo che non ci siano sprechi di memoria.You must be able to both quickly allocate memory to virtual machines depending on their requirements (peak and off-peak loads) and ensure that the memory is not wasted. La funzionalità di memoria dinamica di Hyper-V migliora la flessibilità nell'allocazione e gestione della memoria tra le macchine virtuali in esecuzione in un host.The Hyper-V Dynamic Memory feature increases agility in how the memory is allocated and managed between virtual machines running on a host.

Quando si esegue la virtualizzazione di un database con tabelle ottimizzate per la memoria è necessario modificare alcune procedure consigliate per la virtualizzazione e la gestione di SQL Server.Some best practices for virtualizing and managing SQL Server need to be modified when virtualizing a database with memory-optimized tables. Senza tabelle ottimizzate per la memoria, due delle procedure consigliate sono:Without memory-optimized tables, two of the best practices are:

  • Se si usa min server memory, è consigliabile assegnare solo la quantità di memoria necessaria in modo che rimanga memoria sufficiente per altri processi (evitando quindi il paging).If you use min server memory, it is better to assign only the amount of memory that is required so sufficient memory remains for other processes (thereby avoiding paging).
  • Non impostare un valore di preallocazione della memoria troppo elevato.Do not set the memory pre-allocation value too high. In caso contrario, è possibile che non ci sia memoria sufficiente per altri processi che la richiedono, con conseguente paging della memoria.Otherwise, other processes may not get sufficient memory at the time when they require it, and this can result in memory paging.

Se si seguono le procedure sopra indicate per un database con tabelle ottimizzate per la memoria, un tentativo di ripristinare e recuperare un database potrebbe far sì che il database rimanga nello stato "Recupero in sospeso", anche se la quantità di memoria è sufficiente per il recupero del database.If you follow the above practices for a database with memory-optimized tables, an attempt to restore and recover a database could result in the database being in a “Recovery Pending” state, even if you have sufficient memory to recover the database. Il motivo è che all'avvio di OLTP in memoria i dati vengono inseriti nella memoria in maniera più drastica rispetto all'allocazione della memoria al database da parte dell'allocazione dinamica della memoria.The reason for this is that, when starting up, In-Memory OLTP brings data into memory more aggressively than dynamic memory allocation allocates memory to the database.

SoluzioneResolution

Per risolvere questo problema, preallocare al database una quantità di memoria sufficiente per il recupero o il riavvio del database, anziché un valore minimo che si basa sulla memoria dinamica per ottenere memoria aggiuntiva se necessario.To mitigate this, pre-allocate sufficient memory to the database to recover or restart the database, not a minimum value relying on dynamic memory to provide the additional memory when needed.

Vedere ancheSee Also

Gestione della memoria per OLTP in memoria Managing Memory for In-Memory OLTP
Monitorare e risolvere i problemi relativi all'utilizzo della memoria Monitor and Troubleshoot Memory Usage
Associazione di un database con tabelle con ottimizzazione per la memoria a un pool di risorse Bind a Database with Memory-Optimized Tables to a Resource Pool
Guida all'architettura di gestione della memoriaMemory Management Architecture guide
Opzioni di configurazione del server Server MemoryServer Memory Server Configuration Options