Condividi tramite


Opzioni di configurazione della memoria del server

Si applica a:SQL Server

L'utilizzo della memoria per il motore di database di SQL Server è associato da una coppia di impostazioni min server memory (MB) di configurazione e max server memory (MB). Nel corso del tempo e in circostanze normali, SQL Server tenterà di richiedere memoria fino al limite impostato da max server memory (MB).

Nota

Indici columnstore: panoramica e In-Memory panoramica oltp e gli scenari di utilizzo degli oggetti hanno i propri impiegati di memoria, che semplificano il monitoraggio dell'utilizzo del pool di buffer. Per altre informazioni, vedere sys.dm_os_memory_clerks.

Nelle versioni precedenti di SQL Server, l'utilizzo della memoria era virtualmente illimitato, indicando SQL Server che tutta la memoria di sistema era utilizzabile. È consigliabile in tutte le versioni di SQL Server configurare un limite massimo per l'utilizzo della memoria di SQL Server configurando .max server memory (MB)

  • A partire da SQL Server 2019 (15.x), il programma di installazione di SQL nei server Windows fornisce una raccomandazione per un'istanza max server memory (MB) autonoma di SQL Server in base a una percentuale di memoria di sistema disponibile al momento dell'installazione.
  • In qualsiasi momento è possibile riconfigurare i limiti di memoria (in megabyte) per un processo di SQL Server usato da un'istanza di SQL Server tramite le min server memory (MB) opzioni di configurazione e max server memory (MB) .

Nota

Questa guida fa riferimento all'istanza di SQL Server in Windows. Per informazioni sulla configurazione della memoria in Linux, vedere Procedure consigliate per le prestazioni e linee guida per la configurazione per SQL Server in Linux e l'impostazione memory.memorylimitmb.

Consigli

Le impostazioni predefinite e i valori minimi consentiti per queste opzioni sono:

Opzione Predefiniti Valore minimo consentito Consigliato
min server memory (MB) 0 0 0
max server memory (MB) 2.147.483.647 megabyte (MB) 128 MB 75% della memoria di sistema disponibile non utilizzata da altri processi, incluse le altre istanze. Per raccomandazioni più dettagliate, vedere Memoria massima del server.

Entro questi limiti, SQL Server può modificare i propri requisiti di memoria in modo dinamico in base alle risorse di sistema disponibili. Per altre informazioni, vedere Gestione della memoria dinamica.

  • L'impostazione max server memory (MB) di un valore troppo elevato può causare la concorrenza di una singola istanza di SQL Server per la memoria con altre istanze di SQL Server ospitate nello stesso host.
  • Tuttavia, l'impostazione max server memory (MB) troppo bassa è un'opportunità per le prestazioni persa e potrebbe causare problemi di utilizzo della memoria e prestazioni nell'istanza di SQL Server.
  • L'impostazione max server memory (MB) del valore minimo può anche impedire l'avvio di SQL Server. Se non è possibile avviare SQL Server dopo aver modificato questa opzione, avviarla usando l'opzione di avvio e ripristinarne -f il max server memory (MB) valore precedente. Per altre informazioni, vedere Opzioni di avvio del servizio del motore di database.
  • Non è consigliabile impostare max server memory (MB) e min server memory (MB) corrispondere allo stesso valore o vicino agli stessi valori.

Nota

L'opzione max server memory limita solo le dimensioni del pool di buffer di SQL Server. L'opzione di memoria massima del server non limita l'area di memoria residua non riservata che SQL Server lascia per l'allocazione di altri componenti, ad esempio stored procedure estese, oggetti COM, DLL non condivise ed EXE.

SQL Server può usare la memoria in modo dinamico. È tuttavia possibile impostare manualmente le opzioni per la memoria e limitare la quantità di memoria a cui può accedere SQL Server. Prima di impostare la quantità di memoria per SQL Server, determinare l'impostazione di memoria appropriata sottraendo, dalla memoria fisica totale, la memoria necessaria per il sistema operativo, le allocazioni di memoria non controllate dall'impostazione max server memory (MB) e qualsiasi altra istanza di SQL Server (e altri usi del sistema, se il server ospita altre applicazioni che utilizzano memoria, incluse altre istanze di SQL Server). La differenza così ottenuta rappresenta la quantità di memoria massima assegnabile all'istanza corrente di SQL Server.

La memoria può essere configurata fino al limite dello spazio degli indirizzi virtuali del processo in tutte le edizioni di SQL Server. Per altre informazioni, vedere Memory Limits for Windows and Windows Server Releases (Limiti di memoria per le diverse versioni di Windows e Windows Server).

Memoria minima del server

Usare min server memory (MB) per garantire una quantità minima di memoria disponibile per Gestione memoria di SQL Server.

  • SQL Server non alloca immediatamente la quantità di memoria specificata in all'avvio min server memory (MB) . Tuttavia, dopo che l'utilizzo della memoria ha raggiunto questo valore a causa del caricamento del client, SQL Server non può liberare memoria a meno che il valore di min server memory (MB) non venga ridotto. Ad esempio, quando diverse istanze di SQL Server vengono installate contemporaneamente nello stesso server, è consigliabile impostare il min server memory (MB) parametro per riservare memoria per un'istanza di .

  • L'impostazione di un min server memory (MB) valore è essenziale in un ambiente virtualizzato per garantire che la pressione di memoria dall'host sottostante non tenti di deallocare la memoria dal pool di buffer in una macchina virtuale guest oltre a ciò che è necessario per ottenere prestazioni accettabili. Idealmente, le istanze di SQL Server in una macchina virtuale non devono competere con i processi di deallocazione della memoria proattiva dell'host virtuale.

  • SQL Server non garantisce di allocare la quantità di memoria specificata in min server memory (MB). Se il carico nel server non richiede mai l'allocazione della quantità di memoria specificata in min server memory (MB), SQL Server userà meno memoria.

Memoria massima del server

Usare max server memory (MB) per garantire che il sistema operativo e altre applicazioni non verifichino un utilizzo dannoso della memoria proveniente da SQL Server.

  • Prima di impostare la configurazione, monitorare l'utilizzo max server memory (MB) complessivo della memoria del server che ospita l'istanza di SQL Server, durante il normale funzionamento, per determinare la disponibilità e i requisiti di memoria. Per una configurazione iniziale o quando non è possibile raccogliere l'utilizzo della memoria del processo di SQL Server nel tempo, usare l'approccio consigliato generalizzato seguente per configurare max server memory (MB) per una singola istanza:
    • Dalla memoria totale del sistema operativo, sottrarre l'equivalente delle potenziali allocazioni di memoria del thread di SQL Server al di fuori max server memory (MB) del controllo, ovvero le dimensioni dello stack1 moltiplicate per il numero massimo di thread di lavoro calcolato2.
    • Sottrarre quindi 25% per altre allocazioni di memoria al di fuori max server memory (MB) del controllo, ad esempio buffer di backup, DLL di stored procedure estese, oggetti creati tramite procedure di automazione (sp_OA chiamate) e allocazioni da provider di server collegati. Si tratta di un'approssimazione generica e il chilometraggio può variare.
    • Ciò che rimane deve essere l'impostazione max server memory (MB) per una singola configurazione dell'istanza.

1 Fare riferimento alla Guida sull'architettura di gestione della memoria per informazioni sulle dimensioni degli stack di thread per ogni architettura.

2 Per altre informazioni sui thread di lavoro predefiniti calcolati per un determinato numero di CPU affinizzate nell'host corrente, vedere Configurazione del server: max worker thread.

Impostare manualmente le opzioni

Le opzioni min server memory (MB) del server e max server memory (MB) possono essere impostate per estendersi su un intervallo di valori di memoria. Questo metodo è utile per gli amministratori di sistema o di database che vogliono configurare un'istanza di SQL Server con i requisiti di memoria di altre applicazioni o altre istanze di SQL Server eseguite nello stesso host.

Usare Transact-SQL

Le min server memory (MB) opzioni e max server memory (MB) sono opzioni avanzate. Quando si usa la stored procedure di sistema sp_configure per modificare queste impostazioni, è possibile modificarle solo se il valore di show advanced options è impostato su 1. Queste impostazioni diventano effettive immediatamente e non richiedono il riavvio del server. Per altre informazioni, vedere sp_configure.

Nell'esempio seguente l'opzione max server memory (MB) viene impostata su 12.288 MB o 12 GB. Anche se sp_configure specifica il nome dell'opzione come max server memory (MB), è possibile omettere (MB).

EXECUTE sp_configure 'show advanced options', 1;
GO

RECONFIGURE;
GO

EXECUTE sp_configure 'max server memory', 12288;
GO

RECONFIGURE;
GO

La query seguente restituisce informazioni sui valori attualmente configurati e il valore attualmente in uso. Questa query restituisce risultati indipendentemente dal fatto che l'opzione sp_configure 'show advanced options' sia abilitata.

SELECT [name],
       [value],
       [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)'
      OR [name] = 'min server memory (MB)';

Usare SQL Server Management Studio

Usare min server memory (MB) e max server memory (MB) per riconfigurare la quantità di memoria (in megabyte) gestita da Gestione memoria di SQL Server per un'istanza di SQL Server.

  1. In Esplora oggetti fare clic con il pulsante destro del mouse su un server e scegliere Proprietà.

  2. Selezionare la pagina Memoria della finestra Proprietà server. Vengono visualizzati i valori correnti di Memoria minima per il server e Memoria massima per il server.

  3. In Opzioni per la memoria del server immettere i numeri desiderati per Memoria minima per il server e Memoria massima per il server. Per i valori consigliati, vedere min server memory (MB) e max server memory (MB) in questo articolo.

Lo screenshot seguente illustra tutti e tre i passaggi:

Screenshot delle opzioni configurazione della memoria in SSMS.

Blocco di pagine in memoria

Le applicazioni basate su Windows possono usare le API AWE (Address Windowing Extensions) di Windows per allocare e mappare la memoria fisica nello spazio indirizzi del processo. Questi criteri di LPIM Windows determinano gli account autorizzati ad accedere all'API per mantenere i dati nella memoria fisica, impedendo al sistema di eseguire il paging dei dati nella memoria virtuale su disco. La memoria allocata con AWE è bloccata finché l'applicazione non la libera esplicitamente o non esce. L'uso delle API AWE per la gestione della memoria in SQL Server a 64 bit viene spesso definito pagine bloccate. Il blocco delle pagine in memoria può garantire il corretto funzionamento del server quando si verifica il paging della memoria su disco. L'opzione Blocco di pagine in memoria è abilitata nelle istanze di SQL Server Standard Edition ed edizioni superiori quando all'account con i privilegi per l'esecuzione di sqlservr.exe è stato concesso il diritto utente di Windows Blocco di pagine in memoria.

Per disabilitare l'opzione Blocco di pagine in memoria per SQL Server, rimuovere il diritto utente Blocco di pagine in memoria per l'account con i privilegi per l'esecuzione di sqlservr.exe (l'account di avvio di SQL Server).

L'uso del blocco di pagine in memoria non influisce sulla gestione dinamica della memoria di SQL Server, consentendone l'espansione o la riduzione su richiesta di altri clerk di memoria. Quando si usa l'utente Blocca pagine in memoria , è consigliabile impostare un limite superiore per max server memory (MB). Per altre informazioni, vedere max server memory (MB).

Il blocco di pagine in memoria deve essere usato in presenza di segnali di page out del processo sqlservr. In questo caso, verrà segnalato l'errore 17890 nel log degli errori, simile a quello riportato nell'esempio seguente:

A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.

L'uso di LPIM con un'impostazione configurata max server memory (MB) in modo non corretto che non tiene conto di altri consumer di memoria nel sistema potrebbe causare instabilità, a seconda della quantità di memoria richiesta da altri processi o dei requisiti di memoria di SQL Server all'esterno dell'ambito di max server memory (MB). Per altre informazioni, vedere max server memory. Se viene concesso il privilegio Blocco pagine in memoria (LPIM) (nei sistemi a 32 bit o a 64 bit), è consigliabile impostare max server memory (MB) su un valore specifico, anziché lasciare il valore predefinito di 2.147.483.647 megabyte (MB).

Nota

A partire da SQL Server 2012 (11.x), il flag di traccia 845 non è necessario per l'uso di pagine bloccate in Standard Edition.

Abilitare Blocco di pagine in memoria

Dopo aver valutato le informazioni precedenti, per abilitare l'opzione Blocco di pagine in memoria concedendo il privilegio all'account del servizio per l'istanza di SQL Server, vedere Abilitare l'opzione Blocco di pagine in memoria (Windows).

Per determinare l'account del servizio per l'istanza di SQL Server, fare riferimento a Gestione configurazione SQL Server o eseguire una query su service_account da sys.dm_server_services. Per altre informazioni, vedere sys.dm_server_services.

Visualizzare lo stato di Blocco di pagine in memoria

Per determinare se il privilegio Blocco di pagine in memoria viene concesso all'account del servizio per l'istanza di SQL Server, usare la query seguente. Questa query è supportata in SQL Server 2016 (13.x) SP1 e versioni successive.

SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;

I valori seguenti di sql_memory_model_desc indicano lo stato del blocco di pagine in memoria:

  • CONVENTIONAL. Il privilegio Blocco di pagine in memoria non viene concesso.
  • LOCK_PAGES. Il privilegio Blocco di pagine in memoria viene concesso.
  • LARGE_PAGES. I privilegi di blocco delle pagine in memoria vengono concessi quando si è in modalità Enterprise con il trace flag 834 abilitato. Si tratta di una configurazione avanzata non consigliata per la maggior parte degli ambienti. Per altre informazioni e avvertenze importanti, vedere flag di traccia 834.

Usare i metodi seguenti per determinare se l'istanza di SQL Server usa pagine bloccate:

  • L'output della seguente query Transact-SQL indica valori diversi da zero per locked_page_allocations_kb:

    SELECT osn.node_id,
           osn.memory_node_id,
           osn.node_state_desc,
           omn.locked_page_allocations_kb
    FROM sys.dm_os_memory_nodes AS omn
         INNER JOIN sys.dm_os_nodes AS osn
             ON (omn.memory_node_id = osn.memory_node_id)
    WHERE osn.node_state_desc <> 'ONLINE DAC';
    
  • Il log corrente degli errori di SQL Server segnala il messaggio Using locked pages in the memory manager durante l'avvio del server.

  • La sezione Memory Manager dell'output DBCC MEMORYSTATUS mostra un valore diverso da zero per l'elemento AWE Allocated.

Istanze multiple di SQL Server

Quando si eseguono più istanze del motore di database, è possibile gestire la memoria in modi diversi:

  • Usare max server memory (MB) in ogni istanza per controllare l'utilizzo della memoria, come descritto in precedenza. Stabilire le impostazioni massime per ogni istanza, accertandosi che il totale non sia superiore alla memoria fisica disponibile sul computer. È possibile rendere la memoria di ogni istanza proporzionale al relativo carico di lavoro previsto o alle dimensioni del database. Questo approccio presenta il vantaggio di rendere la memoria libera immediatamente disponibile ad ogni nuovo processo o istanza. Lo svantaggio è che se non vengono eseguite tutte le istanze, parte della memoria resterà inutilizzata.

  • Usare min server memory (MB) in ogni istanza per controllare l'utilizzo della memoria, come descritto in precedenza. Stabilire le impostazioni minime per ogni istanza, in modo che la somma di tali minimi sia di 1 - 2 GB inferiore alla memoria fisica totale del computer. Anche in questo caso, i minimi possono essere resi proporzionali al carico previsto dell'istanza. Con questo approccio, quando non vengono eseguite tutte le istanze contemporaneamente, quelle in esecuzione potranno usare la memoria libera rimanente. Questo approccio consente inoltre di riservare a SQL Server una quantità ragionevole di memoria quando sullo stesso computer vengono eseguiti anche altri processi particolarmente onerosi. Lo svantaggio è che quando si avvia una nuova istanza (o qualsiasi altro processo), le istanze eseguite rilasceranno la memoria con un certo ritardo, in particolare quando a tale scopo dovranno riscrivere le pagine modificate nei rispettivi database.

  • Usare sia che max server memory (MB)min server memory (MB) in ogni istanza per controllare l'utilizzo della memoria, osservare e ottimizzare l'utilizzo massimo di ogni istanza e la protezione minima della memoria in un'ampia gamma di potenziali livelli di utilizzo della memoria.

  • Non intervenire in alcun modo (non consigliato). Le prime istanze sottoposte a carico di lavoro tendono ad allocare tutta la memoria. Alle istanze inattive o a quelle avviate in un secondo momento verrà destinata solo una minima quantità di memoria disponibile. In SQL Server non viene ripartita in alcun modo la memoria tra le diverse istanze. Tutte le istanze, tuttavia, risponderanno ai segnali di Windows Memory Notification correggendo di conseguenza le dimensioni dei rispettivi footprint di memoria. In Windows la memoria non viene bilanciata tra le applicazioni tramite l'API di Windows Memory Notification. Offre invece un semplice feedback globale sulla disponibilità di memoria nel sistema.

Poiché è possibile modificare queste impostazioni senza riavviare le istanze, sarà possibile provare agevolmente valori diversi fino a individuare quelli più adatti alle esigenze.

Esempi

R. Impostare l'opzione di memoria massima del server su 4 GB

Nell'esempio seguente l'opzione max server memory (MB) viene impostata su 4096 MB o 4 GB. Anche se sp_configure specifica il nome dell'opzione come max server memory (MB), è possibile omettere (MB).

EXECUTE sp_configure 'show advanced options', 1;
GO

RECONFIGURE;
GO

EXECUTE sp_configure 'max server memory', 4096;
GO

RECONFIGURE;
GO

L'output risultante sarà un'istruzione simile a Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install. Il nuovo limite della memoria avrà effetto immediatamente all'atto dell'esecuzione di RECONFIGURE. Per altre informazioni, vedere sp_configure.

B. Determinare l'allocazione di memoria corrente

La query seguente restituisce le informazioni sulla memoria attualmente allocata.

SELECT physical_memory_in_use_kb / 1024 AS sql_physical_memory_in_use_MB,
       large_page_allocations_kb / 1024 AS sql_large_page_allocations_MB,
       locked_page_allocations_kb / 1024 AS sql_locked_page_allocations_MB,
       virtual_address_space_reserved_kb / 1024 AS sql_VAS_reserved_MB,
       virtual_address_space_committed_kb / 1024 AS sql_VAS_committed_MB,
       virtual_address_space_available_kb / 1024 AS sql_VAS_available_MB,
       page_fault_count AS sql_page_fault_count,
       memory_utilization_percentage AS sql_memory_utilization_percentage,
       process_physical_memory_low AS sql_process_physical_memory_low,
       process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;

C. Visualizzare il valore di max server memory (MB)

La query seguente restituisce informazioni sul valore attualmente configurato e il valore in uso. Questa query restituisce risultati indipendentemente dal fatto che l'opzione sp_configure 'show advanced options' sia abilitata.

SELECT [value], [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)';